#if __GLASGOW_HASKELL__ < 710
#endif
module Control.Monad.Ether.Writer.Class
( MonadWriter(..)
, listens
, censor
) where
#if __GLASGOW_HASKELL__ < 710
import Data.Monoid
#endif
import qualified Control.Monad.Trans.Ether.Writer as W
import qualified Control.Monad.Trans.Lift.Listen as Lift
import qualified Control.Monad.Trans.Lift.Pass as Lift
class (Monoid w, Monad m) => MonadWriter tag w m | m tag -> w where
writer :: proxy tag -> (a, w) -> m a
writer t ~(a, w) = do
tell t w
return a
tell :: proxy tag -> w -> m ()
tell t w = writer t ((),w)
listen :: proxy tag -> m a -> m (a, w)
pass :: proxy tag -> m (a, w -> w) -> m a
listens :: MonadWriter tag w m => proxy tag -> (w -> b) -> m a -> m (a, b)
listens t f m = do
~(a, w) <- listen t m
return (a, f w)
censor :: MonadWriter tag w m => proxy tag -> (w -> w) -> m a -> m a
censor t f m = pass t $ do
a <- m
return (a, f)
instance (Monoid w, Monad m, w ~ w') => MonadWriter tag w (W.WriterT tag w' m) where
writer = W.writer
tell = W.tell
listen = W.listen
pass = W.pass
instance
( Lift.LiftListen t
, Lift.LiftPass t
, Monad (t m)
, MonadWriter tag w m
, Monoid w
) => MonadWriter tag w (t m) where
writer t = Lift.lift . writer t
tell t = Lift.lift . tell t
listen t = Lift.liftListen (listen t)
pass t = Lift.liftPass (pass t)