@@ -43,8 +43,8 @@ module Effectful.Internal.Monad
4343
4444import Control.Applicative (liftA2)
4545import Control.Concurrent (myThreadId)
46+import Control.Exception
4647import Control.Monad.Base
47−import Control.Monad.Catch
4848import Control.Monad.Fix
4949import Control.Monad.IO.Class
5050import Control.Monad.IO.Unlift
@@ -52,6 +52,7 @@ import Control.Monad.Trans.Control
5252import Data.Unique
5353import GHC.Magic (oneShot)
5454import System.IO.Unsafe (unsafeDupablePerformIO)
55+import qualified Control.Monad.Catch as E
5556
5657import Effectful.Internal.Effect
5758import Effectful.Internal.Env
@@ -149,17 +150,18 @@ instance MonadFix (Eff es) where
149150----------------------------------------
150151-- Exception
151152
152−instance MonadThrow (Eff es) where
153− throwM = unsafeEff_ . throwM
153+instance E.MonadThrow (Eff es) where
154+ throwM = unsafeEff_ . throwIO
154155
155−instance MonadCatch (Eff es) where
156+instance E.MonadCatch (Eff es) where
156157 catch m handler = unsafeEff $ \es -> do
157158 size <- sizeEnv es
158159 unEff m es `catch` \e -> do
159160 checkSizeEnv size es
160161 unEff (handler e) es
162+ {-# INLINABLE catch #-}
161163
162−instance MonadMask (Eff es) where
164+instance E.MonadMask (Eff es) where
163165 mask k = unsafeEff $ \es -> mask $ \restore ->
164166 unEff (k $ \m -> unsafeEff $ restore . unEff m) es
165167
@@ -171,11 +173,12 @@ instance MonadMask (Eff es) where
171173 resource <- unEff acquire es
172174 b <- restore (unEff (use resource) es) `catch` \e -> do
173175 checkSizeEnv size es
174− _ <- unEff (release resource $ ExitCaseException e) es
175− throwM e
176+ _ <- unEff (release resource $ E.ExitCaseException e) es
177+ throwIO e
176178 checkSizeEnv size es
177− c <- unEff (release resource $ ExitCaseSuccess b) es
179+ c <- unEff (release resource $ E.ExitCaseSuccess b) es
178180 pure (b, c)
181+ {-# INLINABLE generalBracket #-}
179182
180183----------------------------------------
181184-- Fail
@@ -196,7 +199,7 @@ runFail m = unsafeEff $ \es0 -> mask $ \release -> do
196199
197200instance Fail :> es => MonadFail (Eff es) where
198201 fail msg = readerEffectM $ \(IdE (Fail tag)) -> unsafeEff_ $ do
199− throwM $ FailEx tag msg
202+ throwIO $ FailEx tag msg
200203
201204--------------------
202205
@@ -212,7 +215,7 @@ tryFailIO tag m =
212215 (Right <$> m) `catch` \err@(FailEx etag msg) -> do
213216 if tag == etag
214217 then pure $ Left msg
215− else throwM err
218+ else throwIO err
216219
217220----------------------------------------
218221-- IO