1
1
-- | This module defines the reader-writer-state monad transformer, `RWST`.
2
2
3
3
module Control.Monad.RWS.Trans
4
- ( See (), mkSee
4
+ ( See ()
5
5
, RWST (..), runRWST , evalRWST , execRWST , mapRWST , withRWST
6
6
, module Control.Monad.Trans
7
7
, module Control.Monad.RWS.Class
@@ -22,14 +22,7 @@ import Control.Monad.State.Class
22
22
import Control.Monad.Trans
23
23
import Control.Monad.Writer.Class
24
24
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
33
26
34
27
-- | The reader-writer-state monad transformer, which combines the operations
35
28
-- | of `ReaderT`, `WriterT` and `StateT` into a single monad transformer.
@@ -41,11 +34,11 @@ runRWST (RWST x) = x
41
34
42
35
-- | Run a computation in the `RWST` monad, discarding the final state.
43
36
evalRWST :: 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 )
45
38
46
39
-- | Run a computation in the `RWST` monad, discarding the result.
47
40
execRWST :: 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 )
49
42
50
43
-- | Change the result and accumulator types in a `RWST` monad action.
51
44
mapRWST :: 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
55
48
withRWST :: forall r1 r2 w s m a . (r2 -> s -> Tuple r1 s ) -> RWST r1 w s m a -> RWST r2 w s m a
56
49
withRWST f m = RWST \r s -> uncurry (runRWST m) (f r s)
57
50
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
60
53
61
54
instance applyRWST :: (Bind m , Monoid w ) => Apply (RWST r w s m ) where
62
55
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'')
66
59
67
60
instance bindRWST :: (Bind m , Monoid w ) => Bind (RWST r w s m ) where
68
61
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)
72
65
73
66
instance 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
75
68
76
69
instance monadRWST :: (Monad m , Monoid w ) => Monad (RWST r w s m )
77
70
78
71
instance 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
80
73
81
74
instance monadEffRWS :: (Monad m , Monoid w , MonadEff eff m ) => MonadEff eff (RWST r w s m ) where
82
75
liftEff = lift <<< liftEff
83
76
84
77
instance 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
86
79
local f m = RWST \r s -> runRWST m (f r) s
87
80
88
81
instance 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
90
83
91
84
instance 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)
95
88
96
89
instance monadRWSRWST :: (Monad m , Monoid w ) => MonadRWS r w s (RWST r w s m )
97
90
@@ -100,10 +93,10 @@ instance monadErrorRWST :: (MonadError e m, Monoid w) => MonadError e (RWST r w
100
93
catchError m h = RWST $ \r s -> catchError (runRWST m r s) (\e -> runRWST (h e) r s)
101
94
102
95
instance 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)
104
97
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