polysemy-plugin-0.2.5.1: src/Polysemy/Plugin/Fundep/Utils.hs
module Polysemy.Plugin.Fundep.Utils where
import Control.Applicative
import Data.Bifunctor
import Data.List
------------------------------------------------------------------------------
-- | Returns the head of the list iff there is exactly one element.
singleListToJust :: [a] -> Maybe a
singleListToJust [a] = Just a
singleListToJust _ = Nothing
------------------------------------------------------------------------------
-- | Like 'Control.Monad.when', but in the context of an 'Alternative'.
whenA
:: (Monad m, Alternative z)
=> Bool
-> m a
-> m (z a)
whenA False _ = pure empty
whenA True ma = pure <$> ma
------------------------------------------------------------------------------
-- | Count the number of times 'a' is present in the list.
countLength :: Eq a => [a] -> [(a, Int)]
countLength as =
let grouped = group as
in zipWith (curry $ bimap head length) grouped grouped