11-- | This module defines the reader-writer-state monad transformer, `RWST`.
22
33module Control.Monad.RWS.Trans
4- ( See (), mkSee
4+ ( See ()
55 , RWST (..), runRWST , evalRWST , execRWST , mapRWST , withRWST
66 , module Control.Monad.Trans
77 , module Control.Monad.RWS.Class
@@ -22,14 +22,7 @@ import Control.Monad.State.Class
2222import Control.Monad.Trans
2323import Control.Monad.Writer.Class
2424
25- type See s a w =
26- { state :: s
27- , result :: a
28- , log :: w
29- }
30-
31- mkSee :: forall s a w . (Monoid w ) => s -> a -> w -> See s a w
32- mkSee s a w = { state: s, result: a, log: w }
25+ data See state result writer = See state result writer
3326
3427-- | The reader-writer-state monad transformer, which combines the operations
3528-- | of `ReaderT`, `WriterT` and `StateT` into a single monad transformer.
@@ -41,11 +34,11 @@ runRWST (RWST x) = x
4134
4235-- | Run a computation in the `RWST` monad, discarding the final state.
4336evalRWST :: forall r w s m a . (Monad m ) => RWST r w s m a -> r -> s -> m (Tuple a w )
44- evalRWST m r s = runRWST m r s >>= \see -> return (Tuple see. result see.log )
37+ evalRWST m r s = runRWST m r s >>= \( See _ result writer) -> return (Tuple result writer )
4538
4639-- | Run a computation in the `RWST` monad, discarding the result.
4740execRWST :: forall r w s m a . (Monad m ) => RWST r w s m a -> r -> s -> m (Tuple s w )
48- execRWST m r s = runRWST m r s >>= \see -> return (Tuple see. state see.log )
41+ execRWST m r s = runRWST m r s >>= \( See state _ writer) -> return (Tuple state writer )
4942
5043-- | Change the result and accumulator types in a `RWST` monad action.
5144mapRWST :: forall r w1 w2 s m1 m2 a1 a2 . (m1 (See s a1 w1 ) -> m2 (See s a2 w2 )) -> RWST r w1 s m1 a1 -> RWST r w2 s m2 a2
@@ -55,43 +48,43 @@ mapRWST f m = RWST \r s -> f $ runRWST m r s
5548withRWST :: forall r1 r2 w s m a . (r2 -> s -> Tuple r1 s ) -> RWST r1 w s m a -> RWST r2 w s m a
5649withRWST f m = RWST \r s -> uncurry (runRWST m) (f r s)
5750
58- instance functorRWST :: (Functor m ) => Functor (RWST r w s m ) where
59- map f m = RWST \r s -> (\see -> see{result = f see. result} ) <$> runRWST m r s
51+ instance functorRWST :: (Functor m , Monoid w ) => Functor (RWST r w s m ) where
52+ map f m = RWST \r s -> (\( See state result writer) -> See state (f result) writer ) <$> runRWST m r s
6053
6154instance applyRWST :: (Bind m , Monoid w ) => Apply (RWST r w s m ) where
6255 apply f m = RWST \r s ->
63- runRWST f r s >>= \{state = s', result = f', log = w'} ->
64- runRWST m r s' <#> \{state = s'', result = a'', log = w''} ->
65- mkSee s'' (f' a'') (w' ++ w'')
56+ runRWST f r s >>= \( See s' f' w') ->
57+ runRWST m r s' <#> \( See s'' a'' w'') ->
58+ See s'' (f' a'') (w' ++ w'')
6659
6760instance bindRWST :: (Bind m , Monoid w ) => Bind (RWST r w s m ) where
6861 bind m f = RWST \r s ->
69- runRWST m r s >>= \{result = a, state = s', log = l} ->
70- runRWST (f a) r s' <#> \see' ->
71- see' { log = l ++ see'.log }
62+ runRWST m r s >>= \( See s' a w) ->
63+ runRWST (f a) r s' <#> \( See state result writer) ->
64+ See state result (w ++ writer)
7265
7366instance applicativeRWST :: (Monad m , Monoid w ) => Applicative (RWST r w s m ) where
74- pure a = RWST \_ s -> pure $ mkSee s a mempty
67+ pure a = RWST \_ s -> pure $ See s a mempty
7568
7669instance monadRWST :: (Monad m , Monoid w ) => Monad (RWST r w s m )
7770
7871instance monadTransRWST :: (Monoid w ) => MonadTrans (RWST r w s ) where
79- lift m = RWST \_ s -> m >>= \a -> return $ mkSee s a mempty
72+ lift m = RWST \_ s -> m >>= \a -> return $ See s a mempty
8073
8174instance monadEffRWS :: (Monad m , Monoid w , MonadEff eff m ) => MonadEff eff (RWST r w s m ) where
8275 liftEff = lift <<< liftEff
8376
8477instance monadReaderRWST :: (Monad m , Monoid w ) => MonadReader r (RWST r w s m ) where
85- ask = RWST \r s -> pure $ mkSee s r mempty
78+ ask = RWST \r s -> pure $ See s r mempty
8679 local f m = RWST \r s -> runRWST m (f r) s
8780
8881instance monadStateRWST :: (Monad m , Monoid w ) => MonadState s (RWST r w s m ) where
89- state f = RWST \_ s -> case f s of Tuple a s' -> pure $ mkSee s' a mempty
82+ state f = RWST \_ s -> case f s of Tuple a s' -> pure $ See s' a mempty
9083
9184instance monadWriterRWST :: (Monad m , Monoid w ) => MonadWriter w (RWST r w s m ) where
92- writer (Tuple a w) = RWST \_ s -> pure $ { state: s, result: a, log: w }
93- listen m = RWST \r s -> runRWST m r s >>= \{ state: s', result: a, log: w} -> pure { state: s', result: Tuple a w, log: w }
94- pass m = RWST \r s -> runRWST m r s >>= \{ result: Tuple a f, state: s', log: w} -> pure { state: s', result: a, log: f w }
85+ writer (Tuple a w) = RWST \_ s -> pure $ See s a w
86+ listen m = RWST \r s -> runRWST m r s >>= \( See s' a w) -> pure $ See s' ( Tuple a w) w
87+ pass m = RWST \r s -> runRWST m r s >>= \( See s' ( Tuple a f) w) -> pure $ See s' a ( f w)
9588
9689instance monadRWSRWST :: (Monad m , Monoid w ) => MonadRWS r w s (RWST r w s m )
9790
@@ -100,10 +93,10 @@ instance monadErrorRWST :: (MonadError e m, Monoid w) => MonadError e (RWST r w
10093 catchError m h = RWST $ \r s -> catchError (runRWST m r s) (\e -> runRWST (h e) r s)
10194
10295instance monadRecRWST :: (Monoid w , MonadRec m ) => MonadRec (RWST r w s m ) where
103- tailRecM k a = RWST \r s -> tailRecM (k' r) { writer: mempty, state: s, result: a }
96+ tailRecM k a = RWST \r s -> tailRecM (k' r) ( See s a mempty)
10497 where
105- k' r o = do
106- see <- runRWST (k o. result) r o. state
107- return case see. result of
108- Left a -> Left { state: see.state, result: a, writer: o.writer <> see.log }
109- Right b -> Right (mkSee see. state b (o. writer <> see.log ))
98+ k' r ( See state result writer) = do
99+ See state' result' writer' <- runRWST (k result) r state
100+ return case result' of
101+ Left a -> Left ( See state' a ( writer <> writer'))
102+ Right b -> Right (See state' b (writer <> writer' ))
0 commit comments