0 | module Control.Monad.State.Tuple
 1 |
 2 | import Control.Monad.State.State
 3 | import public Control.Monad.State.Interface
 4 | import Control.Monad.RWS.CPS
 5 |
 6 | %default total
 7 |
 8 | export
 9 | Monad m => MonadState l (StateT (l, r) m) where
10 |   get = Builtin.fst <$> get
11 |   put = modify . mapFst . const
12 |
13 | wrapFst : Functor m => StateT r m a -> StateT (l, r) m a
14 | wrapFst act = ST $ \(x, y) => mapFst (x,) <$> runStateT y act
15 |
16 | export
17 | MonadState s (StateT r m) => Monad m => MonadState s (StateT (l, r) m) where
18 |   get = wrapFst get
19 |   put = wrapFst . put
20 |
21 | export
22 | Monad m => MonadState sl (RWST r w (sl, sr) m) where
23 |   get = Builtin.fst <$> get
24 |   put = modify . mapFst . const
25 |
26 | wrapFst' : Functor m => RWST r w sr m a -> RWST r w (sl, sr) m a
27 | wrapFst' $ MkRWST rwst = MkRWST $ \r, (sx, sy), w => rwst r sy w <&> \(a, sy', w') => (a, (sx, sy'), w')
28 |
29 | export
30 | MonadState s (RWST r w sr m) => Monad m => MonadState s (RWST r w (sl, sr) m) where
31 |   get = wrapFst' get
32 |   put = wrapFst' . put
33 |