on master help sign in
Use RunIn in more places
commit70c4352111cc82a4efd2da6022617e0b4caef06d authorAndrzej Rybczak <andrzej@rybczak.net> dateSat 26 Jun 2021, 18:27 (5 years ago) parenteb1e75e
3 files changed+20−15
src/Effectful/Internal/Monad.hs+10−1 src/Effectful/Interpreter.hs+2−6 src/Effectful/State/Dynamic.hs+8−8
src/Effectful/Internal/Monad.hs+10−1
@@ -12,6 +12,9 @@ module Effectful.Internal.Monad
1212 , runEff
1313 , unsafeEff
1414 , unsafeEff_
15+
16+ -- ** Running in 'IO'
17+ , RunIn
1518 , unsafeUnliftEff
1619
1720 -- * IO
@@ -63,8 +66,14 @@ unsafeEff m = Eff (oneShot m)
6366unsafeEff_ :: IO a -> Eff es a
6467unsafeEff_ m = unsafeEff $ \_ -> m
6568
69+----------------------------------------
70+
71+-- | A function that runs 'Eff' computations in @m@ (usually a local 'Eff'
72+-- environment or 'IO').
73+type RunIn es m = forall r. Eff es r -> m r
74+
6675-- | Lower 'Eff' computations into 'IO'.
67−unsafeUnliftEff :: ((forall r. Eff es r -> IO r) -> IO a) -> Eff es a
76+unsafeUnliftEff :: (RunIn es IO -> IO a) -> Eff es a
6877unsafeUnliftEff f = unsafeEff $ \es -> do
6978 tid0 <- myThreadId
7079 f $ \(Eff m) -> do
src/Effectful/Interpreter.hs+2−6
@@ -29,7 +29,7 @@ import Effectful.Internal.Monad
2929data Interpreter (e :: Effect) = forall localEs. Interpreter
3030 { _env :: Env localEs
3131 , _interpret :: forall a es. HasCallStack
32− => (forall r. Eff es r -> IO r)
32+ => RunIn es IO
3333 -> e (Eff es) a
3434 -> Eff localEs a
3535 }
@@ -57,10 +57,6 @@ send op = readerEffectM $ \Interpreter{..} -> do
5757----------------------------------------
5858-- Interpretation
5959
60−-- | A function that runs 'Eff' computations in @m@ (usually a local 'Eff'
61−-- environment or 'IO').
62−type RunIn es m = forall r. Eff es r -> m r
63−
6460-- | Interpret a first order effect.
6561interpret
6662 :: (forall r es. HasCallStack => e (Eff es) r -> Eff baseEs r)
@@ -101,7 +97,7 @@ reinterpret
10197 :: (Eff localEs a -> Eff baseEs b)
10298 -- ^ Introduction of local effects
10399 -> (forall r es. HasCallStack => e (Eff es) r -> Eff localEs r)
104− -- ^ The efect handler
100+ -- ^ The effect handler
105101 -> Eff (e : baseEs) a
106102 -> Eff baseEs b
107103reinterpret runLocal interpreter m = unsafeEff $ \es -> do
src/Effectful/State/Dynamic.hs+8−8
@@ -63,10 +63,10 @@ execState :: s -> Eff (State s : es) a -> Eff es s
6363execState s0 = reinterpretM (SP.execState s0) statePure
6464
6565statePure
66− :: SP.State s :> es
67− => (forall r. Eff es0 r -> Eff es r)
68− -> State s (Eff es0) a
69− -> Eff es a
66+ :: SP.State s :> localEs
67+ => RunIn es (Eff localEs)
68+ -> State s (Eff es) a
69+ -> Eff localEs a
7070statePure run = \case
7171 Get -> SP.get
7272 Put s -> SP.put s
@@ -86,10 +86,10 @@ execStateMVar :: s -> Eff (State s : es) a -> Eff es s
8686execStateMVar s0 = reinterpretM (SM.execState s0) stateMVar
8787
8888stateMVar
89− :: SM.State s :> es
90− => (forall r. Eff es0 r -> Eff es r)
91− -> State s (Eff es0) a
92− -> Eff es a
89+ :: SM.State s :> localEs
90+ => (forall r. Eff es r -> Eff localEs r)
91+ -> State s (Eff es) a
92+ -> Eff localEs a
9393stateMVar run = \case
9494 Get -> SM.get
9595 Put s -> SM.put s