{-# LANGUAGE CPP #-}
module Control.Monad.Exception.IO (
EM, tryEM, tryEMWithLoc, runEM, runEMParanoid,
EMT(..), CallTrace, tryEMT, tryEMTWithLoc, runEMT, runEMTParanoid, AnyException, UncaughtException,
Throws, Caught,
throw, rethrow, catch, catchWithSrcLoc,
finally, onException, bracket, wrapException,
showExceptionWithTrace,
FailException(..), MonadZeroException(..), mplusDefault,
Exception(..), SomeException(..), Typeable,
Failure(..),
#if !MIN_VERSION_failure(0,2,0)
Try(..), NothingException(..),
WrapFailure(..),
#endif
) where
import Control.Monad.Exception.Base
import Control.Monad.Exception.Throws
import Control.Monad.Exception.Catch (Exception, SomeException, fromException, MonadCatch)
import qualified Control.Monad.Exception.Catch
import Control.Failure
import Control.Monad.Trans.Control
import Data.Typeable
import Control.Exception.Lifted as CE (try)
catch :: (Exception e, MonadBaseControl IO m) => EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catch :: EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catch EMT (Caught e l) m a
emt e -> EMT l m a
h = EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
forall e (m :: * -> *) l a.
(Exception e, MonadBaseControl IO m) =>
EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
catchWithSrcLoc EMT (Caught e l) m a
emt ((e -> EMT l m a) -> CallTrace -> e -> EMT l m a
forall a b. a -> b -> a
const e -> EMT l m a
h)
unwrap :: MonadBaseControl IO m => EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unwrap :: EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unwrap EMT l m a
m = do
Either SomeException (Either (CallTrace, CheckedException l) a)
v <- m (Either (CallTrace, CheckedException l) a)
-> m (Either
SomeException (Either (CallTrace, CheckedException l) a))
forall (m :: * -> *) e a.
(MonadBaseControl IO m, Exception e) =>
m a -> m (Either e a)
CE.try (m (Either (CallTrace, CheckedException l) a)
-> m (Either
SomeException (Either (CallTrace, CheckedException l) a)))
-> m (Either (CallTrace, CheckedException l) a)
-> m (Either
SomeException (Either (CallTrace, CheckedException l) a))
forall a b. (a -> b) -> a -> b
$ EMT l m a -> m (Either (CallTrace, CheckedException l) a)
forall l (m :: * -> *) a.
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unEMT EMT l m a
m
case Either SomeException (Either (CallTrace, CheckedException l) a)
v of
Right Either (CallTrace, CheckedException l) a
x -> Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return Either (CallTrace, CheckedException l) a
x
Left SomeException
e -> Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return ((CallTrace, CheckedException l)
-> Either (CallTrace, CheckedException l) a
forall a b. a -> Either a b
Left ([], SomeException -> CheckedException l
forall l. SomeException -> CheckedException l
CheckedException SomeException
e))
catchWithSrcLoc :: (Exception e, MonadBaseControl IO m) => EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
catchWithSrcLoc :: EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
catchWithSrcLoc EMT (Caught e l) m a
emt CallTrace -> e -> EMT l m a
h = m (Either (CallTrace, CheckedException l) a) -> EMT l m a
forall l (m :: * -> *) a.
m (Either (CallTrace, CheckedException l) a) -> EMT l m a
EMT (m (Either (CallTrace, CheckedException l) a) -> EMT l m a)
-> m (Either (CallTrace, CheckedException l) a) -> EMT l m a
forall a b. (a -> b) -> a -> b
$ do
Either (CallTrace, CheckedException (Caught e l)) a
v <- EMT (Caught e l) m a
-> m (Either (CallTrace, CheckedException (Caught e l)) a)
forall (m :: * -> *) l a.
MonadBaseControl IO m =>
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unwrap EMT (Caught e l) m a
emt
case Either (CallTrace, CheckedException (Caught e l)) a
v of
Right a
x -> Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Either (CallTrace, CheckedException l) a
forall a b. b -> Either a b
Right a
x)
Left (CallTrace
trace, CheckedException SomeException
e) -> SomeException
-> CallTrace -> m (Either (CallTrace, CheckedException l) a)
handle SomeException
e CallTrace
trace
where handle :: SomeException
-> CallTrace -> m (Either (CallTrace, CheckedException l) a)
handle SomeException
e CallTrace
trace =
case SomeException -> Maybe e
forall e. Exception e => SomeException -> Maybe e
fromException SomeException
e of
Maybe e
Nothing -> Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return ((CallTrace, CheckedException l)
-> Either (CallTrace, CheckedException l) a
forall a b. a -> Either a b
Left (CallTrace
trace,SomeException -> CheckedException l
forall l. SomeException -> CheckedException l
CheckedException SomeException
e))
Just e
e' -> EMT l m a -> m (Either (CallTrace, CheckedException l) a)
forall l (m :: * -> *) a.
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unEMT (CallTrace -> e -> EMT l m a
h CallTrace
trace e
e')
instance (Exception e, MonadBaseControl IO m) => MonadCatch e (EMT (Caught e l) m) (EMT l m) where
catchWithSrcLoc :: EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
catchWithSrcLoc = EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
forall e (m :: * -> *) l a.
(Exception e, MonadBaseControl IO m) =>
EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
catchWithSrcLoc
catch :: EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catch = EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
forall e (m :: * -> *) l a.
(Exception e, MonadBaseControl IO m) =>
EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catch
finally :: MonadBaseControl IO m => EMT l m a -> EMT l m b -> EMT l m a
finally :: EMT l m a -> EMT l m b -> EMT l m a
finally EMT l m a
m EMT l m b
sequel = do { a
v <- EMT l m a
m EMT l m a -> EMT l m b -> EMT l m a
forall (m :: * -> *) l a b.
MonadBaseControl IO m =>
EMT l m a -> EMT l m b -> EMT l m a
`onException` EMT l m b
sequel; b
_ <- EMT l m b
sequel; a -> EMT l m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
v}
onException :: MonadBaseControl IO m => EMT l m a -> EMT l m b -> EMT l m a
onException :: EMT l m a -> EMT l m b -> EMT l m a
onException EMT l m a
m EMT l m b
sequel = m (Either (CallTrace, CheckedException l) a) -> EMT l m a
forall l (m :: * -> *) a.
m (Either (CallTrace, CheckedException l) a) -> EMT l m a
EMT (m (Either (CallTrace, CheckedException l) a) -> EMT l m a)
-> m (Either (CallTrace, CheckedException l) a) -> EMT l m a
forall a b. (a -> b) -> a -> b
$ do
Either (CallTrace, CheckedException l) a
ev <- EMT l m a -> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) l a.
MonadBaseControl IO m =>
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unwrap EMT l m a
m
case Either (CallTrace, CheckedException l) a
ev of
Left{} -> do { Either (CallTrace, CheckedException l) b
_ <- EMT l m b -> m (Either (CallTrace, CheckedException l) b)
forall l (m :: * -> *) a.
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unEMT EMT l m b
sequel; Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return Either (CallTrace, CheckedException l) a
ev}
Right{} -> Either (CallTrace, CheckedException l) a
-> m (Either (CallTrace, CheckedException l) a)
forall (m :: * -> *) a. Monad m => a -> m a
return Either (CallTrace, CheckedException l) a
ev
bracket :: MonadBaseControl IO m =>
EMT l m a
-> (a -> EMT l m b)
-> (a -> EMT l m c)
-> EMT l m c
bracket :: EMT l m a -> (a -> EMT l m b) -> (a -> EMT l m c) -> EMT l m c
bracket EMT l m a
acquire a -> EMT l m b
release a -> EMT l m c
run = do { a
k <- EMT l m a
acquire; a -> EMT l m c
run a
k EMT l m c -> EMT l m b -> EMT l m c
forall (m :: * -> *) l a b.
MonadBaseControl IO m =>
EMT l m a -> EMT l m b -> EMT l m a
`finally` a -> EMT l m b
release a
k }
wrapException :: (Exception e, Throws e' l, MonadBaseControl IO m) =>
(e -> e') -> EMT (Caught e l) m a -> EMT l m a
wrapException :: (e -> e') -> EMT (Caught e l) m a -> EMT l m a
wrapException e -> e'
mkE EMT (Caught e l) m a
m = EMT (Caught e l) m a
m EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
forall e (m :: * -> *) l a.
(Exception e, MonadBaseControl IO m) =>
EMT (Caught e l) m a -> (CallTrace -> e -> EMT l m a) -> EMT l m a
`catchWithSrcLoc` \CallTrace
loc e
e -> CallTrace -> e' -> EMT l m a
forall e l (m :: * -> *) a.
(Throws e l, Monad m) =>
CallTrace -> e -> EMT l m a
rethrow CallTrace
loc (e -> e'
mkE e
e)