@@ -0,0 +1,32 @@
1+module Effectful.Reader.Dynamic
2+ ( Reader
3+ , runReader
4+ , ask
5+ , asks
6+ , local
7+ ) where
8+
9+import Effectful.Handler
10+import Effectful.Monad
11+import qualified Effectful.Reader as R
12+
13+data Reader r :: Effect where
14+ Ask :: Reader r m r
15+ Local :: (r -> r) -> m a -> Reader r m a
16+
17+runReader :: r -> Eff (Reader r : es) a -> Eff es a
18+runReader r = reinterpretM (R.runReader r) $ \env -> \case
19+ Ask -> R.ask
20+ Local f m -> localSeqUnlift env $ \unlift -> R.local f (unlift m)
21+
22+----------------------------------------
23+-- Operations
24+
25+ask :: (HasCallStack, Reader r :> es) => Eff es r
26+ask = send Ask
27+
28+asks :: (HasCallStack, Reader r :> es) => (r -> a) -> Eff es a
29+asks f = f <$> ask
30+
31+local :: (HasCallStack, Reader r :> es ) => (r -> r) -> Eff es a -> Eff es a
32+local f = send . Local f