on master help sign in
Use RunIn in more places
70c4352Andrzej Rybczak
src/Effectful/Internal/Monad.hs+10−1
@@ -12,6 +12,9 @@ module Effectful.Internal.Monad
12 , runEff
12 , runEff
13 , unsafeEff
13 , unsafeEff
14 , unsafeEff_
14 , unsafeEff_
15+
16+ -- ** Running in 'IO'
17+ , RunIn
15 , unsafeUnliftEff
18 , unsafeUnliftEff
16
19
17 -- * IO
20 -- * IO
@@ -63,8 +66,14 @@ unsafeEff m = Eff (oneShot m)
63unsafeEff_ :: IO a -> Eff es a
66unsafeEff_ :: IO a -> Eff es a
64unsafeEff_ m = unsafeEff $ \_ -> m
67unsafeEff_ m = unsafeEff $ \_ -> m
65
68
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+
66-- | Lower 'Eff' computations into 'IO'.
75-- | 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
68unsafeUnliftEff f = unsafeEff $ \es -> do
77unsafeUnliftEff f = unsafeEff $ \es -> do
69 tid0 <- myThreadId
78 tid0 <- myThreadId
70 f $ \(Eff m) -> do
79 f $ \(Eff m) -> do
src/Effectful/Interpreter.hs+2−6
@@ -29,7 +29,7 @@ import Effectful.Internal.Monad
29data Interpreter (e :: Effect) = forall localEs. Interpreter
29data Interpreter (e :: Effect) = forall localEs. Interpreter
30 { _env :: Env localEs
30 { _env :: Env localEs
31 , _interpret :: forall a es. HasCallStack
31 , _interpret :: forall a es. HasCallStack
32− => (forall r. Eff es r -> IO r)
32+ => RunIn es IO
33 -> e (Eff es) a
33 -> e (Eff es) a
34 -> Eff localEs a
34 -> Eff localEs a
35 }
35 }
@@ -57,10 +57,6 @@ send op = readerEffectM $ \Interpreter{..} -> do
57----------------------------------------
57----------------------------------------
58-- Interpretation
58-- Interpretation
59
59
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−
64-- | Interpret a first order effect.
60-- | Interpret a first order effect.
65interpret
61interpret
66 :: (forall r es. HasCallStack => e (Eff es) r -> Eff baseEs r)
62 :: (forall r es. HasCallStack => e (Eff es) r -> Eff baseEs r)
@@ -101,7 +97,7 @@ reinterpret
101 :: (Eff localEs a -> Eff baseEs b)
97 :: (Eff localEs a -> Eff baseEs b)
102 -- ^ Introduction of local effects
98 -- ^ Introduction of local effects
103 -> (forall r es. HasCallStack => e (Eff es) r -> Eff localEs r)
99 -> (forall r es. HasCallStack => e (Eff es) r -> Eff localEs r)
104− -- ^ The efect handler
100+ -- ^ The effect handler
105 -> Eff (e : baseEs) a
101 -> Eff (e : baseEs) a
106 -> Eff baseEs b
102 -> Eff baseEs b
107reinterpret runLocal interpreter m = unsafeEff $ \es -> do
103reinterpret 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
63execState s0 = reinterpretM (SP.execState s0) statePure
63execState s0 = reinterpretM (SP.execState s0) statePure
64
64
65statePure
65statePure
66− :: SP.State s :> es
66+ :: SP.State s :> localEs
67− => (forall r. Eff es0 r -> Eff es r)
67+ => RunIn es (Eff localEs)
68− -> State s (Eff es0) a
68+ -> State s (Eff es) a
69− -> Eff es a
69+ -> Eff localEs a
70statePure run = \case
70statePure run = \case
71 Get -> SP.get
71 Get -> SP.get
72 Put s -> SP.put s
72 Put s -> SP.put s
@@ -86,10 +86,10 @@ execStateMVar :: s -> Eff (State s : es) a -> Eff es s
86execStateMVar s0 = reinterpretM (SM.execState s0) stateMVar
86execStateMVar s0 = reinterpretM (SM.execState s0) stateMVar
87
87
88stateMVar
88stateMVar
89− :: SM.State s :> es
89+ :: SM.State s :> localEs
90− => (forall r. Eff es0 r -> Eff es r)
90+ => (forall r. Eff es r -> Eff localEs r)
91− -> State s (Eff es0) a
91+ -> State s (Eff es) a
92− -> Eff es a
92+ -> Eff localEs a
93stateMVar run = \case
93stateMVar run = \case
94 Get -> SM.get
94 Get -> SM.get
95 Put s -> SM.put s
95 Put s -> SM.put s