module Data.Monoid.Acme where
import Control.Applicative
{- |
Many generalization for Monoid instances.
Issue #2
-}
mmany :: (Alternative a, Monoid m) => a m -> a m
mmany f = foldl mappend mempty <$> many f
{- |
Some generatlization for Monoid instances.
Issue #2
-}
msome :: (Alternative a, Monoid m) => a m -> a m
msome f = foldl mappend mempty <$> some f
{- |
Utility for casting bare values into a Monoid in mmany.
For example, the function:
> let sumMany = manyWith Sum getSum
will sum the results of many.
Issue #2
-}
manyWith :: (Alternative a, Monoid m) => (v -> m) -> (m -> v) -> a v -> a v
manyWith toMonoid fromMonoid f = fromMonoid <$> (mmany $ toMonoid <$> f)
{- |
Utility for casting bare values into a Monoid in msome.
For example, the function:
> let sumSome = someWith Sum getSum
will sum the results of some.
Issue #2
-}
someWith :: (Alternative a, Monoid m) => (v -> m) -> (m -> v) -> a v -> a v
someWith toMonoid fromMonoid f = fromMonoid <$> (msome $ toMonoid <$> f)