monoids-0.1.2: Data/Monoid/Multiplicative.hs
module Data.Monoid.Multiplicative
( module Data.Monoid.Additive
, MultiplicativeMonoid
, one, times
) where
import Data.Monoid.Additive
import Data.FingerTree
import Data.Monoid.FromString
import Data.Monoid.Monad.Identity
import Data.Monoid.Generator
import qualified Data.Sequence as Seq
import Data.Sequence (Seq)
class MultiplicativeMonoid m where
one :: m
times :: m -> m -> m
instance Monoid m => MultiplicativeMonoid [m] where
one = [mempty]
xss `times` yss = [ xs `mappend` ys | xs <- xss, ys <- yss ]
instance (Measured v m, Monoid m) => MultiplicativeMonoid (FingerTree v m) where
one = singleton mempty
xss `times` yss = runIdentity $ mapReduce (flip fmap' yss . mappend) xss
instance (Monoid m) => MultiplicativeMonoid (Seq m) where
one = Seq.singleton mempty
xss `times` yss = runIdentity $ mapReduce (flip fmap yss . mappend) xss
instance MultiplicativeMonoid m => MultiplicativeMonoid (Identity m) where
one = Identity one
Identity a `times` Identity b = Identity (a `times` b)
instance MultiplicativeMonoid m => MultiplicativeMonoid (FromString m) where
one = FromString one
FromString a `times` FromString b = FromString (a `times` b)