module Control.Monad.WriterX (
module Control.Monad.WriterX.Lazy,
module Control.Monad.Index
) where
import Control.Monad.WriterX.Lazy
import Control.Monad.Index
import Control.Monad.Error
import Control.Monad.Writer
import Control.Monad.Reader
import Control.Monad.State
instance (Error e, MonadWriterX ix w m, Index ix) => MonadWriterX ix w (ErrorT e m) where
tellx (ixv::ix) = lift . tellx ixv
listenx (ixv::ix) m = ErrorT $ do
(a, w) <- listenx ixv (runErrorT m)
case a of
Left l -> return $ Left l
Right r -> return $ Right (r, w)
passx (ixv::ix) m = ErrorT $ passx ixv $ do
a <- runErrorT m
case a of
Left l -> return (Left l, id)
Right (r, f) -> return (Right r, f)
instance (MonadWriterX ixw w m, Index ixw, Monoid w2) => MonadWriterX ixw w (WriterT w2 m) where
tellx (ixv::ixw) = lift . tellx ixv
listenx (ixv::ixw) m = WriterT $ do
~((a,s'),w) <- listenx ixv (runWriterT m)
return ((a,w),s')
passx (ixv::ixw) m = WriterT $ passx ixv $ do
~((a,f),s') <- runWriterT m
return ((a,s'),f)
instance (MonadWriterX ixw w m, Index ixw) => MonadWriterX ixw w (StateT s m) where
tellx (ixv::ixw) = lift . tellx ixv
listenx (ixv::ixw) m = StateT $ \s -> do
~((a,s'),w) <- listenx ixv (runStateT m s)
return ((a,w),s')
passx (ixv::ixw) m = StateT $ \s -> passx ixv $ do
~((a,f),s') <- runStateT m s
return ((a,s'),f)
instance (Index ixw, MonadWriterX ixw w m) => MonadWriterX ixw w (ReaderT r m) where
tellx (ixv::ixw) = lift . tellx ixv
listenx (ixv::ixw) m = ReaderT $ \w -> listenx ixv (runReaderT m w)
passx (ixv::ixw) m = ReaderT $ \w -> passx ixv (runReaderT m w)