monoid-transformer-0.0.4: src/Data/Monoid/MonadicEndo.hs
module Data.Monoid.MonadicEndo where
import Data.Monoid (Monoid, mempty, mappend, )
import Data.Semigroup (Semigroup, (<>), )
{- |
Like Data.Monoid.Endo but with monadic result.
'mempty' is 'return' and 'mappend' is '<=<'.
Useful e.g. for handling options with GetOpt.
-}
newtype T m a = Cons {run :: a -> m a}
instance Monad m => Semigroup (T m a) where
Cons x <> Cons y =
Cons $ (x =<<) . y
-- Cons $ x <=< y
instance Monad m => Monoid (T m a) where
mempty = Cons return
mappend = (<>)