module Data.Monoid.Multiplicative.Transformer
    ( module Data.Monoid.Multiplicative
    , Log(Log, getLog)
    , Exp(Exp, getExp) 
    ) where

import Data.Monoid.Multiplicative

data Log m = Log { getLog :: m }

instance MultiplicativeMonoid m => Monoid (Log m) where
    mempty = Log one
    Log a `mappend` Log b = Log (a `times` b)

data Exp m = Exp { getExp :: m }

instance Monoid m => MultiplicativeMonoid (Exp m) where
    one = Exp mempty
    Exp a `times` Exp b = Exp (a `mappend` b)