(original) (raw)

{-# LANGUAGE Safe #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE UndecidableInstances #-}

module Control.Monad.Writer.Class ( MonadWriter(..), listens, censor, ) where

import Control.Monad.Trans.Except (ExceptT) import qualified Control.Monad.Trans.Except as Except import Control.Monad.Trans.Identity (IdentityT) import qualified Control.Monad.Trans.Identity as Identity import Control.Monad.Trans.Maybe (MaybeT) import qualified Control.Monad.Trans.Maybe as Maybe import Control.Monad.Trans.Reader (ReaderT, mapReaderT) import qualified Control.Monad.Trans.RWS.Lazy as LazyRWS import qualified Control.Monad.Trans.RWS.Strict as StrictRWS import qualified Control.Monad.Trans.State.Lazy as Lazy import qualified Control.Monad.Trans.State.Strict as Strict import qualified Control.Monad.Trans.Writer.Lazy as Lazy import qualified Control.Monad.Trans.Writer.Strict as Strict import Control.Monad.Trans.Accum (AccumT) import qualified Control.Monad.Trans.Accum as Accum import qualified Control.Monad.Trans.RWS.CPS as CPSRWS import qualified Control.Monad.Trans.Writer.CPS as CPS import Control.Monad.Trans.Class (lift)

class (Monoid w, Monad m) => MonadWriter w m | m -> w where {-# MINIMAL (writer | tell), listen, pass #-}

[writer](Control.Monad.Writer.Class.html#writer) :: ([a](#local-6989586621679047690),[w](#local-6989586621679047693)) -> [m](#local-6989586621679047692) [a](#local-6989586621679047690)
[writer](Control.Monad.Writer.Class.html#writer) ~(a

a, w w) = do forall w (m :: * -> *). MonadWriter w m => w -> m () tell w w forall (m :: * -> *) a. Monad m => a -> m a return a a

[tell](Control.Monad.Writer.Class.html#tell)   :: [w](#local-6989586621679047693) -> [m](#local-6989586621679047692) ()
[tell](Control.Monad.Writer.Class.html#tell) w

w = forall w (m :: * -> *) a. MonadWriter w m => (a, w) -> m a writer ((),w w)

[listen](Control.Monad.Writer.Class.html#listen) :: [m](#local-6989586621679047692) [a](#local-6989586621679047678) -> [m](#local-6989586621679047692) ([a](#local-6989586621679047678), [w](#local-6989586621679047693))


[pass](Control.Monad.Writer.Class.html#pass)   :: [m](#local-6989586621679047692) ([a](#local-6989586621679047671), [w](#local-6989586621679047693) -> [w](#local-6989586621679047693)) -> [m](#local-6989586621679047692) [a](#local-6989586621679047671)

listens :: MonadWriter w m => (w -> b) -> m a -> m (a, b) listens :: forall w (m :: * -> *) b a. MonadWriter w m => (w -> b) -> m a -> m (a, b) listens w -> b f m a m = do ~(a a, w w) <- forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen m a m forall (m :: * -> *) a. Monad m => a -> m a return (a a, w -> b f w w)

censor :: MonadWriter w m => (w -> w) -> m a -> m a censor :: forall w (m :: * -> *) a. MonadWriter w m => (w -> w) -> m a -> m a censor w -> w f m a m = forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass forall a b. (a -> b) -> a -> b $ do a a <- m a m forall (m :: * -> *) a. Monad m => a -> m a return (a a, w -> w f)

instance (Monoid w) => MonadWriter w ((,) w) where writer :: forall a. (a, w) -> (w, a) writer ~(a a, w w) = (w w, a a) tell :: w -> (w, ()) tell w w = (w w, ()) listen :: forall a. (w, a) -> (w, (a, w)) listen ~(w w, a a) = (w w, (a a, w w)) pass :: forall a. (w, (a, w -> w)) -> (w, a) pass ~(w w, (a a, w -> w f)) = (w -> w f w w, a a)

instance (Monoid w, Monad m) => MonadWriter w (CPS.WriterT w m) where writer :: forall a. (a, w) -> WriterT w m a writer = forall w (m :: * -> *) a. (Monoid w, Monad m) => (a, w) -> WriterT w m a CPS.writer tell :: w -> WriterT w m () tell = forall w (m :: * -> *). (Monoid w, Monad m) => w -> WriterT w m () CPS.tell listen :: forall a. WriterT w m a -> WriterT w m (a, w) listen = forall w (m :: * -> *) a. (Monoid w, Monad m) => WriterT w m a -> WriterT w m (a, w) CPS.listen pass :: forall a. WriterT w m (a, w -> w) -> WriterT w m a pass = forall w w' (m :: * -> *) a. (Monoid w, Monoid w', Monad m) => WriterT w m (a, w -> w') -> WriterT w' m a CPS.pass

instance (Monoid w, Monad m) => MonadWriter w (Lazy.WriterT w m) where writer :: forall a. (a, w) -> WriterT w m a writer = forall (m :: * -> *) a w. Monad m => (a, w) -> WriterT w m a Lazy.writer tell :: w -> WriterT w m () tell = forall (m :: * -> *) w. Monad m => w -> WriterT w m () Lazy.tell listen :: forall a. WriterT w m a -> WriterT w m (a, w) listen = forall (m :: * -> *) w a. Monad m => WriterT w m a -> WriterT w m (a, w) Lazy.listen pass :: forall a. WriterT w m (a, w -> w) -> WriterT w m a pass = forall (m :: * -> *) w a. Monad m => WriterT w m (a, w -> w) -> WriterT w m a Lazy.pass

instance (Monoid w, Monad m) => MonadWriter w (Strict.WriterT w m) where writer :: forall a. (a, w) -> WriterT w m a writer = forall (m :: * -> *) a w. Monad m => (a, w) -> WriterT w m a Strict.writer tell :: w -> WriterT w m () tell = forall (m :: * -> *) w. Monad m => w -> WriterT w m () Strict.tell listen :: forall a. WriterT w m a -> WriterT w m (a, w) listen = forall (m :: * -> *) w a. Monad m => WriterT w m a -> WriterT w m (a, w) Strict.listen pass :: forall a. WriterT w m (a, w -> w) -> WriterT w m a pass = forall (m :: * -> *) w a. Monad m => WriterT w m (a, w -> w) -> WriterT w m a Strict.pass

instance (Monoid w, Monad m) => MonadWriter w (CPSRWS.RWST r w s m) where writer :: forall a. (a, w) -> RWST r w s m a writer = forall w (m :: * -> *) a r s. (Monoid w, Monad m) => (a, w) -> RWST r w s m a CPSRWS.writer tell :: w -> RWST r w s m () tell = forall w (m :: * -> *) r s. (Monoid w, Monad m) => w -> RWST r w s m () CPSRWS.tell listen :: forall a. RWST r w s m a -> RWST r w s m (a, w) listen = forall w (m :: * -> *) r s a. (Monoid w, Monad m) => RWST r w s m a -> RWST r w s m (a, w) CPSRWS.listen pass :: forall a. RWST r w s m (a, w -> w) -> RWST r w s m a pass = forall w w' (m :: * -> *) r s a. (Monoid w, Monoid w', Monad m) => RWST r w s m (a, w -> w') -> RWST r w' s m a CPSRWS.pass

instance (Monoid w, Monad m) => MonadWriter w (LazyRWS.RWST r w s m) where writer :: forall a. (a, w) -> RWST r w s m a writer = forall (m :: * -> *) a w r s. Monad m => (a, w) -> RWST r w s m a LazyRWS.writer tell :: w -> RWST r w s m () tell = forall (m :: * -> *) w r s. Monad m => w -> RWST r w s m () LazyRWS.tell listen :: forall a. RWST r w s m a -> RWST r w s m (a, w) listen = forall (m :: * -> *) r w s a. Monad m => RWST r w s m a -> RWST r w s m (a, w) LazyRWS.listen pass :: forall a. RWST r w s m (a, w -> w) -> RWST r w s m a pass = forall (m :: * -> *) r w s a. Monad m => RWST r w s m (a, w -> w) -> RWST r w s m a LazyRWS.pass

instance (Monoid w, Monad m) => MonadWriter w (StrictRWS.RWST r w s m) where writer :: forall a. (a, w) -> RWST r w s m a writer = forall (m :: * -> *) a w r s. Monad m => (a, w) -> RWST r w s m a StrictRWS.writer tell :: w -> RWST r w s m () tell = forall (m :: * -> *) w r s. Monad m => w -> RWST r w s m () StrictRWS.tell listen :: forall a. RWST r w s m a -> RWST r w s m (a, w) listen = forall (m :: * -> *) r w s a. Monad m => RWST r w s m a -> RWST r w s m (a, w) StrictRWS.listen pass :: forall a. RWST r w s m (a, w -> w) -> RWST r w s m a pass = forall (m :: * -> *) r w s a. Monad m => RWST r w s m (a, w -> w) -> RWST r w s m a StrictRWS.pass

instance MonadWriter w m => MonadWriter w (ExceptT e m) where writer :: forall a. (a, w) -> ExceptT e m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> ExceptT e m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. ExceptT e m a -> ExceptT e m (a, w) listen = forall (m :: * -> *) w e a. Monad m => Listen w m (Either e a) -> Listen w (ExceptT e m) a Except.liftListen forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. ExceptT e m (a, w -> w) -> ExceptT e m a pass = forall (m :: * -> *) w e a. Monad m => Pass w m (Either e a) -> Pass w (ExceptT e m) a Except.liftPass forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance MonadWriter w m => MonadWriter w (IdentityT m) where writer :: forall a. (a, w) -> IdentityT m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> IdentityT m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. IdentityT m a -> IdentityT m (a, w) listen = forall {k1} {k2} (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2). (m a -> n b) -> IdentityT m a -> IdentityT n b Identity.mapIdentityT forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. IdentityT m (a, w -> w) -> IdentityT m a pass = forall {k1} {k2} (m :: k1 -> *) (a :: k1) (n :: k2 -> *) (b :: k2). (m a -> n b) -> IdentityT m a -> IdentityT n b Identity.mapIdentityT forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance MonadWriter w m => MonadWriter w (MaybeT m) where writer :: forall a. (a, w) -> MaybeT m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> MaybeT m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. MaybeT m a -> MaybeT m (a, w) listen = forall (m :: * -> *) w a. Monad m => Listen w m (Maybe a) -> Listen w (MaybeT m) a Maybe.liftListen forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. MaybeT m (a, w -> w) -> MaybeT m a pass = forall (m :: * -> *) w a. Monad m => Pass w m (Maybe a) -> Pass w (MaybeT m) a Maybe.liftPass forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance MonadWriter w m => MonadWriter w (ReaderT r m) where writer :: forall a. (a, w) -> ReaderT r m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> ReaderT r m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. ReaderT r m a -> ReaderT r m (a, w) listen = forall (m :: * -> *) a (n :: * -> *) b r. (m a -> n b) -> ReaderT r m a -> ReaderT r n b mapReaderT forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. ReaderT r m (a, w -> w) -> ReaderT r m a pass = forall (m :: * -> *) a (n :: * -> *) b r. (m a -> n b) -> ReaderT r m a -> ReaderT r n b mapReaderT forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance MonadWriter w m => MonadWriter w (Lazy.StateT s m) where writer :: forall a. (a, w) -> StateT s m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> StateT s m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. StateT s m a -> StateT s m (a, w) listen = forall (m :: * -> *) w a s. Monad m => Listen w m (a, s) -> Listen w (StateT s m) a Lazy.liftListen forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. StateT s m (a, w -> w) -> StateT s m a pass = forall (m :: * -> *) w a s. Monad m => Pass w m (a, s) -> Pass w (StateT s m) a Lazy.liftPass forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance MonadWriter w m => MonadWriter w (Strict.StateT s m) where writer :: forall a. (a, w) -> StateT s m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> StateT s m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. StateT s m a -> StateT s m (a, w) listen = forall (m :: * -> *) w a s. Monad m => Listen w m (a, s) -> Listen w (StateT s m) a Strict.liftListen forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. StateT s m (a, w -> w) -> StateT s m a pass = forall (m :: * -> *) w a s. Monad m => Pass w m (a, s) -> Pass w (StateT s m) a Strict.liftPass forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass

instance ( Monoid w' , MonadWriter w m ) => MonadWriter w (AccumT w' m) where writer :: forall a. (a, w) -> AccumT w' m a writer = forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> ) a. MonadWriter w m => (a, w) -> m a writer tell :: w -> AccumT w' m () tell = forall (t :: ( -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall w (m :: * -> *). MonadWriter w m => w -> m () tell listen :: forall a. AccumT w' m a -> AccumT w' m (a, w) listen = forall (m :: * -> *) w a s. Monad m => Listen w m (a, s) -> Listen w (AccumT s m) a Accum.liftListen forall w (m :: * -> *) a. MonadWriter w m => m a -> m (a, w) listen pass :: forall a. AccumT w' m (a, w -> w) -> AccumT w' m a pass = forall (m :: * -> *) w a s. Monad m => Pass w m (a, s) -> Pass w (AccumT s m) a Accum.liftPass forall w (m :: * -> *) a. MonadWriter w m => m (a, w -> w) -> m a pass