0 | module Control.Eff.Reader
2 | import Control.Eff.Internal
7 | data ReaderL : (lbl : k) -> (env : Type) -> (a : Type) -> Type where
9 | Ask : ReaderL lbl env env
12 | Reader : (env,a : Type) -> Type
16 | askAt : (0 lbl : k) -> Has (ReaderL lbl env) fs => Eff fs env
17 | askAt lbl = send $
Ask {lbl}
20 | ask : Has (Reader env) fs => Eff fs env
24 | asksAt : (0 lbl : k) -> Has (ReaderL lbl env) fs => (env -> a) -> Eff fs a
25 | asksAt lbl f = f <$> askAt lbl
28 | asks : Has (Reader env) fs => (env -> a) -> Eff fs a
37 | {0 m : Type -> Type}
39 | -> ReaderL lbl env a
41 | handleReader x Ask = x
43 | unReader : env -> ReaderL lbl env a -> a
44 | unReader ve Ask = ve
49 | -> {auto _ : Has (ReaderL lbl env) fs}
52 | -> Eff (fs - ReaderL lbl env) t
53 | runReaderAt _ ve = handleRelay pure $
\v,f => f (unReader ve v)
56 | runReader : Has (Reader env) fs => env -> Eff fs t -> Eff (fs - Reader env) t
57 | runReader = runReaderAt ()