0 | module Control.Monad.Writer.Interface
2 | import Control.Monad.Maybe
3 | import Control.Monad.Error.Either
4 | import Control.Monad.Reader.Reader
5 | import Control.Monad.State.State
6 | import Control.Monad.RWS.CPS
7 | import Control.Monad.Trans
8 | import Control.Monad.Writer.CPS
23 | interface (Monoid w,
Monad m) => MonadWriter w m | m where
25 | writer : (a,w) -> m a
26 | writer (a, w) = tell w $> a
30 | tell w = writer ((),w)
34 | listen : m a -> m (a, w)
39 | pass : m (a, w -> w) -> m a
44 | listens : MonadWriter w m => (w -> b) -> m a -> m (a, b)
45 | listens f = map (\(a,w) => (a,f w)) . listen
51 | censor : MonadWriter w m => (w -> w) -> m a -> m a
52 | censor f = pass . map (\a => (a,f))
58 | public export %inline
59 | (Monoid w, Monad m) => MonadWriter w (WriterT w m) where
60 | writer = writerT . pure
62 | listen m = MkWriterT $
\w =>
63 | (\(a,w') => ((a,w'),w <+> w')) <$> runWriterT m
65 | tell w' = writer ((), w')
67 | pass m = MkWriterT $
\w =>
68 | (\((a,f),w') => (a,w <+> f w')) <$> runWriterT m
70 | public export %inline
71 | (Monoid w, Monad m) => MonadWriter w (RWST r w s m) where
72 | writer (a,w') = MkRWST $
\_,s,w => pure (a,s,w <+> w')
74 | tell w' = writer ((), w')
76 | listen m = MkRWST $
\r,s,w =>
77 | (\(a,s',w') => ((a,w'),s',w <+> w')) <$> runRWST r s m
79 | pass m = MkRWST $
\r,s,w =>
80 | (\((a,f),s',w') => (a,s',w <+> f w')) <$> runRWST r s m
82 | public export %inline
83 | MonadWriter w m => MonadWriter w (EitherT e m) where
84 | writer = lift . writer
86 | listen = mapEitherT $
\m => do (e,w) <- listen m
87 | pure $
map (\a => (a,w)) e
89 | pass = mapEitherT $
\m => pass $
do Right (r,f) <- m
90 | | Left l => pure $
(Left l, id)
93 | public export %inline
94 | MonadWriter w m => MonadWriter w (MaybeT m) where
95 | writer = lift . writer
97 | listen = mapMaybeT $
\m => do (e,w) <- listen m
98 | pure $
map (\a => (a,w)) e
100 | pass = mapMaybeT $
\m => pass $
do Just (r,f) <- m
101 | | Nothing => pure $
(Nothing, id)
103 | public export %inline
104 | MonadWriter w m => MonadWriter w (ReaderT r m) where
105 | writer = lift . writer
107 | listen = mapReaderT listen
108 | pass = mapReaderT pass
110 | public export %inline
111 | MonadWriter w m => MonadWriter w (StateT s m) where
112 | writer = lift . writer
114 | listen (ST m) = ST $
\s => do ((s',a),w) <- listen (m s)
117 | pass (ST m) = ST $
\s => pass $
do (s',(a,f)) <- m s