1
1
-- | This module defines the reader-writer-state monad transformer, `RWST`.
2
2
3
3
module Control.Monad.RWS.Trans
4
- ( See ( )
4
+ ( RWSResult (.. )
5
5
, RWST (..), runRWST , evalRWST , execRWST , mapRWST , withRWST
6
6
, module Control.Monad.Trans
7
7
, module Control.Monad.RWS.Class
@@ -22,69 +22,69 @@ import Control.Monad.State.Class
22
22
import Control.Monad.Trans
23
23
import Control.Monad.Writer.Class
24
24
25
- data See state result writer = See state result writer
25
+ data RWSResult state result writer = RWSResult state result writer
26
26
27
27
-- | The reader-writer-state monad transformer, which combines the operations
28
28
-- | of `ReaderT`, `WriterT` and `StateT` into a single monad transformer.
29
- newtype RWST r w s m a = RWST (r -> s -> m (See s a w ))
29
+ newtype RWST r w s m a = RWST (r -> s -> m (RWSResult s a w ))
30
30
31
31
-- | Run a computation in the `RWST` monad.
32
- runRWST :: forall r w s m a . RWST r w s m a -> r -> s -> m (See s a w )
32
+ runRWST :: forall r w s m a . RWST r w s m a -> r -> s -> m (RWSResult s a w )
33
33
runRWST (RWST x) = x
34
34
35
35
-- | Run a computation in the `RWST` monad, discarding the final state.
36
36
evalRWST :: forall r w s m a . (Monad m ) => RWST r w s m a -> r -> s -> m (Tuple a w )
37
- evalRWST m r s = runRWST m r s >>= \(See _ result writer) -> return (Tuple result writer)
37
+ evalRWST m r s = runRWST m r s >>= \(RWSResult _ result writer) -> return (Tuple result writer)
38
38
39
39
-- | Run a computation in the `RWST` monad, discarding the result.
40
40
execRWST :: forall r w s m a . (Monad m ) => RWST r w s m a -> r -> s -> m (Tuple s w )
41
- execRWST m r s = runRWST m r s >>= \(See state _ writer) -> return (Tuple state writer)
41
+ execRWST m r s = runRWST m r s >>= \(RWSResult state _ writer) -> return (Tuple state writer)
42
42
43
43
-- | Change the result and accumulator types in a `RWST` monad action.
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
44
+ mapRWST :: forall r w1 w2 s m1 m2 a1 a2 . (m1 (RWSResult s a1 w1 ) -> m2 (RWSResult s a2 w2 )) -> RWST r w1 s m1 a1 -> RWST r w2 s m2 a2
45
45
mapRWST f m = RWST \r s -> f $ runRWST m r s
46
46
47
47
-- | Change the context type in a `RWST` monad action.
48
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
49
49
withRWST f m = RWST \r s -> uncurry (runRWST m) (f r s)
50
50
51
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
52
+ map f m = RWST \r s -> (\(RWSResult state result writer) -> RWSResult state (f result) writer) <$> runRWST m r s
53
53
54
54
instance applyRWST :: (Bind m , Monoid w ) => Apply (RWST r w s m ) where
55
55
apply f m = RWST \r s ->
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'')
56
+ runRWST f r s >>= \(RWSResult s' f' w') ->
57
+ runRWST m r s' <#> \(RWSResult s'' a'' w'') ->
58
+ RWSResult s'' (f' a'') (w' ++ w'')
59
59
60
60
instance bindRWST :: (Bind m , Monoid w ) => Bind (RWST r w s m ) where
61
61
bind m f = RWST \r s ->
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)
62
+ runRWST m r s >>= \(RWSResult s' a w) ->
63
+ runRWST (f a) r s' <#> \(RWSResult state result writer) ->
64
+ RWSResult state result (w ++ writer)
65
65
66
66
instance applicativeRWST :: (Monad m , Monoid w ) => Applicative (RWST r w s m ) where
67
- pure a = RWST \_ s -> pure $ See s a mempty
67
+ pure a = RWST \_ s -> pure $ RWSResult s a mempty
68
68
69
69
instance monadRWST :: (Monad m , Monoid w ) => Monad (RWST r w s m )
70
70
71
71
instance monadTransRWST :: (Monoid w ) => MonadTrans (RWST r w s ) where
72
- lift m = RWST \_ s -> m >>= \a -> return $ See s a mempty
72
+ lift m = RWST \_ s -> m >>= \a -> return $ RWSResult s a mempty
73
73
74
74
instance monadEffRWS :: (Monad m , Monoid w , MonadEff eff m ) => MonadEff eff (RWST r w s m ) where
75
75
liftEff = lift <<< liftEff
76
76
77
77
instance monadReaderRWST :: (Monad m , Monoid w ) => MonadReader r (RWST r w s m ) where
78
- ask = RWST \r s -> pure $ See s r mempty
78
+ ask = RWST \r s -> pure $ RWSResult s r mempty
79
79
local f m = RWST \r s -> runRWST m (f r) s
80
80
81
81
instance monadStateRWST :: (Monad m , Monoid w ) => MonadState s (RWST r w s m ) where
82
- state f = RWST \_ s -> case f s of Tuple a s' -> pure $ See s' a mempty
82
+ state f = RWST \_ s -> case f s of Tuple a s' -> pure $ RWSResult s' a mempty
83
83
84
84
instance monadWriterRWST :: (Monad m , Monoid w ) => MonadWriter w (RWST r w s m ) where
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)
85
+ writer (Tuple a w) = RWST \_ s -> pure $ RWSResult s a w
86
+ listen m = RWST \r s -> runRWST m r s >>= \(RWSResult s' a w) -> pure $ RWSResult s' (Tuple a w) w
87
+ pass m = RWST \r s -> runRWST m r s >>= \(RWSResult s' (Tuple a f) w) -> pure $ RWSResult s' a (f w)
88
88
89
89
instance monadRWSRWST :: (Monad m , Monoid w ) => MonadRWS r w s (RWST r w s m )
90
90
@@ -93,10 +93,10 @@ instance monadErrorRWST :: (MonadError e m, Monoid w) => MonadError e (RWST r w
93
93
catchError m h = RWST $ \r s -> catchError (runRWST m r s) (\e -> runRWST (h e) r s)
94
94
95
95
instance monadRecRWST :: (Monoid w , MonadRec m ) => MonadRec (RWST r w s m ) where
96
- tailRecM k a = RWST \r s -> tailRecM (k' r) (See s a mempty)
96
+ tailRecM k a = RWST \r s -> tailRecM (k' r) (RWSResult s a mempty)
97
97
where
98
- k' r (See state result writer) = do
99
- See state' result' writer' <- runRWST (k result) r state
98
+ k' r (RWSResult state result writer) = do
99
+ RWSResult state' result' writer' <- runRWST (k result) r state
100
100
return case result' of
101
- Left a -> Left (See state' a (writer <> writer'))
102
- Right b -> Right (See state' b (writer <> writer'))
101
+ Left a -> Left (RWSResult state' a (writer <> writer'))
102
+ Right b -> Right (RWSResult state' b (writer <> writer'))
0 commit comments