@@ -0,0 +1,32 @@
1+module Effectful.Reader.Dynamic
9+import Effectful.Handler
10+import Effectful.Monad
11+import qualified Effectful.Reader as R
13+data Reader r :: Effect where
15+ Local :: (r -> r) -> m a -> Reader r m a
17+runReader :: r -> Eff (Reader r : es) a -> Eff es a
18+runReader r = reinterpretM (R.runReader r) $ \env -> \case
20+ Local f m -> localSeqUnlift env $ \unlift -> R.local f (unlift m)
22+----------------------------------------
25+ask :: (HasCallStack, Reader r :> es) => Eff es r
28+asks :: (HasCallStack, Reader r :> es) => (r -> a) -> Eff es a
31+local :: (HasCallStack, Reader r :> es ) => (r -> r) -> Eff es a -> Eff es a
32+local f = send . Local f