0 | module Control.Monad.Writer.Tuple
2 | import Control.Monad.Writer.CPS
3 | import public Control.Monad.Writer.Interface
4 | import Control.Monad.RWS.CPS
11 | Monad m => Monoid l => Monoid r => MonadWriter l (WriterT (l, r) m) where
12 | writer (x, l) = writer (x, l, neutral)
13 | tell x = tell (x, neutral)
14 | pass wr = MkWriterT $
\(ll, rr) => runWriterT wr <&> \((a, f), l, r) => (a, ll <+> f l, rr <+> r)
15 | listen wr = MkWriterT $
\(ll, rr) => runWriterT wr <&> \(x, l, r) => ((x, l), ll <+> l, rr <+> r)
17 | wrapFst : Functor m => WriterT r m a -> WriterT (l, r) m a
18 | wrapFst $
MkWriterT fw = MkWriterT $
\(x, y) => map (x,) <$> fw y
20 | unwrapFst : Functor m => Monoid l => WriterT (l, r) m a -> WriterT r m (a, l)
21 | unwrapFst $
MkWriterT fw = MkWriterT $
\y => fw (neutral, y) <&> \(a, l, r) => ((a, l), r)
24 | MonadWriter s (WriterT r m) => Monoid l => Monoid r => Monad m => MonadWriter s (WriterT (l, r) m) where
25 | writer (x, l) = wrapFst $
writer (x, l)
26 | tell = wrapFst . tell
27 | pass wr = MkWriterT $
\(x, y) => runWriterT (pass $
unwrapFst wr <&> \((a, f), l) => ((a, l), f)) <&> \((a, l), r) => (a, x <+> l, y <+> r)
28 | listen wr = MkWriterT $
\(x, y) => runWriterT (listen $
unwrapFst wr) <&> \(((a, l), s), r) => ((a, s), x <+> l, y <+> r)
33 | Monad m => Monoid wl => Monoid wr => MonadWriter wl (RWST r (wl, wr) s m) where
34 | writer (x, l) = writer (x, l, neutral)
35 | tell x = tell (x, neutral)
36 | pass wr = MkRWST $
\r, s, (ll, rr) => runRWST r s wr <&> \((a, f), s', x, y) => (a, s', ll <+> f x, rr <+> y)
37 | listen wr = MkRWST $
\r, s, (ll, rr) => runRWST r s wr <&> \(a, s', x, y) => ((a, x), s', ll <+> x, rr <+> y)
39 | wrapFst' : Functor m => RWST r wr s m a -> RWST r (wl, wr) s m a
40 | wrapFst' $
MkRWST fw = MkRWST $
\r, s, (x, y) => map @{Compose} (x,) <$> fw r s y
42 | unwrapFst' : Functor m => Monoid wl => RWST r (wl, wr) s m a -> RWST r wr s m (a, wl)
43 | unwrapFst' $
MkRWST fw = MkRWST $
\r, s, y => fw r s (neutral, y) <&> \(a, s, wl, wr) => ((a, wl), s, wr)
46 | MonadWriter v (RWST r wr s m) => Monoid wl => Monoid wr => Monad m => MonadWriter v (RWST r (wl, wr) s m) where
47 | writer (x, l) = wrapFst' $
writer (x, l)
48 | tell = wrapFst' . tell
49 | pass wr = MkRWST $
\r, s, (x, y) => runRWST r s (pass $
unwrapFst' wr <&> \((a, f), l) => ((a, l), f)) <&>
50 | \((a, wl), s, wr) => (a, s, x <+> wl, y <+> wr)
51 | listen wr = MkRWST $
\r, s, (x, y) => runRWST r s (listen $
unwrapFst' wr) <&> \(((a, wl), v), s, wr) => ((a, v), s, x <+> wl, y <+> wr)