@@ -7,11 +7,12 @@
7-- in subsequent releases.
7-- in subsequent releases.
8module Effectful.Internal.Monad
8module Effectful.Internal.Monad
9 ( -- * Monad
9 ( -- * Monad
13 -- ** Access to the internal representation
13 -- ** Access to the internal representation
15 , unsafeEff
16 , unsafeEff
16 , unsafeEff_
17 , unsafeEff_
17 , unsafeUnliftEff
18 , unsafeUnliftEff
@@ -20,10 +21,14 @@ module Effectful.Internal.Monad
23− -- * Helpers
24+ -- * Low-level helpers
24 , runEffect
27 , runEffect
25 , evalEffect
28 , evalEffect
26 , execEffect
29 , execEffect
27 , getEffect
32 , getEffect
28 , putEffect
33 , putEffect
29 , stateEffect
34 , stateEffect
@@ -47,7 +52,7 @@ import Effectful.Internal.Env
48type role Eff nominal representational
53type role Eff nominal representational
50−newtype Eff (es :: [Effect]) a = Eff { unEff :: Env es -> IO a }
55+newtype Eff (es :: [Effect]) a = Eff (Env es -> IO a)
52-- | Run a pure 'Eff' computation.
57-- | Run a pure 'Eff' computation.
@@ -63,6 +68,11 @@ runEff (Eff m) =
63 unsafeDupablePerformIO $ m =<< emptyEnv
68 unsafeDupablePerformIO $ m =<< emptyEnv
65----------------------------------------
70----------------------------------------
71+-- Access to the internal representation
73+-- | Peel off the constructor of 'Eff'.
74+unEff :: Eff es a -> Env es -> IO a
67-- | Access underlying 'IO' monad along with the environment.
77-- | Access underlying 'IO' monad along with the environment.
68unsafeEff :: (Env es -> IO a) -> Eff es a
78unsafeEff :: (Env es -> IO a) -> Eff es a
@@ -100,10 +110,10 @@ type RunIn es m = forall r. Eff es r -> m r
100unsafeUnliftEff :: (RunIn es IO -> IO a) -> Eff es a
110unsafeUnliftEff :: (RunIn es IO -> IO a) -> Eff es a
101unsafeUnliftEff f = unsafeEff $ \es -> do
111unsafeUnliftEff f = unsafeEff $ \es -> do
102 tid0 <- myThreadId
112 tid0 <- myThreadId
103− f $ \(Eff m) -> do
113+ f $ \m -> do
104 tid <- myThreadId
114 tid <- myThreadId
105 if tid == tid0
115 if tid == tid0
106− then m es
116+ then unEff m es
107 else error $ "Running Eff computations in a different thread is "
117 else error $ "Running Eff computations in a different thread is "
108 ++ "currently only possible via the AsyncE effect"
118 ++ "currently only possible via the AsyncE effect"
@@ -134,18 +144,18 @@ instance MonadThrow (Eff es) where
134 throwM = unsafeEff_ . throwM
144 throwM = unsafeEff_ . throwM
136instance MonadCatch (Eff es) where
146instance MonadCatch (Eff es) where
137− catch (Eff m) handler = unsafeEff $ \es -> do
147+ catch m handler = unsafeEff $ \es -> do
138 size <- sizeEnv es
148 size <- sizeEnv es
139− m es `catch` \e -> do
149+ unEff m es `catch` \e -> do
140 checkSizeEnv size es
150 checkSizeEnv size es
141 unEff (handler e) es
151 unEff (handler e) es
143instance MonadMask (Eff es) where
153instance MonadMask (Eff es) where
144 mask k = unsafeEff $ \es -> mask $ \restore ->
154 mask k = unsafeEff $ \es -> mask $ \restore ->
145− unEff (k $ \(Eff m) -> unsafeEff $ restore . m) es
155+ unEff (k $ \m -> unsafeEff $ restore . unEff m) es
147 uninterruptibleMask k = unsafeEff $ \es -> uninterruptibleMask $ \restore ->
157 uninterruptibleMask k = unsafeEff $ \es -> uninterruptibleMask $ \restore ->
148− unEff (k $ \(Eff m) -> unsafeEff $ restore . m) es
158+ unEff (k $ \m -> unsafeEff $ restore . unEff m) es
150 generalBracket acquire release use = unsafeEff $ \es -> mask $ \restore -> do
160 generalBracket acquire release use = unsafeEff $ \es -> mask $ \restore -> do
151 size <- sizeEnv es
161 size <- sizeEnv es
@@ -188,25 +198,25 @@ instance IOE :> es => MonadUnliftIO (Eff es) where
188-- Helpers
198-- Helpers
190runEffect :: i e -> Eff (e : es) a -> Eff es (a, i e)
200runEffect :: i e -> Eff (e : es) a -> Eff es (a, i e)
191−runEffect e0 (Eff m) = unsafeEff $ \es0 -> do
201+runEffect e0 m = unsafeEff $ \es0 -> do
192 size0 <- sizeEnv es0
202 size0 <- sizeEnv es0
193 bracket (unsafeConsEnv e0 noRelinker es0)
203 bracket (unsafeConsEnv e0 noRelinker es0)
194 (unsafeTailEnv size0)
204 (unsafeTailEnv size0)
195− (\es -> (,) <$> m es <*> getEnv es)
205+ (\es -> (,) <$> unEff m es <*> getEnv es)
197evalEffect :: i e -> Eff (e : es) a -> Eff es a
207evalEffect :: i e -> Eff (e : es) a -> Eff es a
198−evalEffect e (Eff m) = unsafeEff $ \es0 -> do
208+evalEffect e m = unsafeEff $ \es0 -> do
199 size0 <- sizeEnv es0
209 size0 <- sizeEnv es0
200 bracket (unsafeConsEnv e noRelinker es0)
210 bracket (unsafeConsEnv e noRelinker es0)
201 (unsafeTailEnv size0)
211 (unsafeTailEnv size0)
202− (\es -> m es)
212+ (\es -> unEff m es)
204execEffect :: i e -> Eff (e : es) a -> Eff es (i e)
214execEffect :: i e -> Eff (e : es) a -> Eff es (i e)
205−execEffect e0 (Eff m) = unsafeEff $ \es0 -> do
215+execEffect e0 m = unsafeEff $ \es0 -> do
206 size0 <- sizeEnv es0
216 size0 <- sizeEnv es0
207 bracket (unsafeConsEnv e0 noRelinker es0)
217 bracket (unsafeConsEnv e0 noRelinker es0)
208 (unsafeTailEnv size0)
218 (unsafeTailEnv size0)
209− (\es -> m es *> getEnv es)
219+ (\es -> unEff m es *> getEnv es)
211getEffect :: e :> es => Eff es (i e)
221getEffect :: e :> es => Eff es (i e)
212getEffect = unsafeEff $ \es -> getEnv es
222getEffect = unsafeEff $ \es -> getEnv es
@@ -221,10 +231,10 @@ stateEffect f = unsafeEff $ \es -> unsafeStateEnv f es
221{-# INLINE stateEffect #-}
231{-# INLINE stateEffect #-}
223localEffect :: e :> es => (i e -> i e) -> Eff es a -> Eff es a
233localEffect :: e :> es => (i e -> i e) -> Eff es a -> Eff es a
224−localEffect f (Eff m) = unsafeEff $ \es -> do
234+localEffect f m = unsafeEff $ \es -> do
225 bracket (unsafeStateEnv (\e -> (e, f e)) es)
235 bracket (unsafeStateEnv (\e -> (e, f e)) es)
226 (\e -> unsafePutEnv e es)
236 (\e -> unsafePutEnv e es)
227− (\_ -> m es)
237+ (\_ -> unEff m es)
228{-# INLINE localEffect #-}
238{-# INLINE localEffect #-}
230readerEffectM :: e :> es => (i e -> Eff es a) -> Eff es a
240readerEffectM :: e :> es => (i e -> Eff es a) -> Eff es a