{-# LANGUAGE CPP #-}
module Control.Monad.Exception.Pure (
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(..),
#if !MIN_VERSION_base(4,7,0)
Typeable1,
#endif
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 (MonadCatch, Exception, SomeException, fromException)
import qualified Control.Monad.Exception.Catch
import Control.Failure
import Data.Typeable
catch :: (Exception e, Monad 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, Monad 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)
catchWithSrcLoc :: (Exception e, Monad 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 l (m :: * -> *) a.
EMT l m a -> m (Either (CallTrace, CheckedException l) a)
unEMT 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, Monad 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, Monad 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, Monad m) =>
EMT (Caught e l) m a -> (e -> EMT l m a) -> EMT l m a
catch
finally :: Monad 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.
Monad 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 :: Monad 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 m (Either (CallTrace, CheckedException l) a)
m) (EMT m (Either (CallTrace, CheckedException l) 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 <- m (Either (CallTrace, CheckedException l) a)
m
case Either (CallTrace, CheckedException l) a
ev of
Left{} -> do { Either (CallTrace, CheckedException l) b
_ <- m (Either (CallTrace, CheckedException l) 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 :: Monad 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.
Monad 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, Monad 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, Monad 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)