0 | module Control.Monad.Reader.Tuple
 1 |
 2 | import Control.Monad.Reader.Reader
 3 | import public Control.Monad.Reader.Interface
 4 | import Control.Monad.RWS.CPS
 5 |
 6 | %default total
 7 |
 8 | export
 9 | Monad m => MonadReader l (ReaderT (l, r) m) where
10 |   ask   = Builtin.fst <$> ask
11 |   local = local . mapFst
12 |
13 | export
14 | MonadReader v (ReaderT r m) => Monad m => MonadReader v (ReaderT (l, r) m) where
15 |   ask   @{sub}       = MkReaderT $ runReaderT' (ask @{sub}) . snd
16 |   local @{sub} f act = MkReaderT $ \(x, y) => runReaderT y $ local @{sub} f $ MkReaderT $ runReaderT' act . (x,)
17 |
18 | export
19 | Monad m => MonadReader rl (RWST (rl, rr) w s m) where
20 |   ask   = Builtin.fst <$> ask
21 |   local = local . mapFst
22 |
23 | export
24 | MonadReader v (RWST rr w s m) => Monad m => MonadReader v (RWST (rl, rr) w s m) where
25 |   ask   @{sub}       = MkRWST $ unRWST (ask @{sub}) . snd
26 |   local @{sub} f act = MkRWST $ \(x, y) => flip unRWST y $ local @{sub} f $ MkRWST $ unRWST act . (x,)
27 |