module Control.Monad.Exception.Synchronous (
Exceptional(..),
fromMaybe, toMaybe,
fromEither, toEither,
fromExitCode, toExitCode,
getExceptionNull,
switch,
force,
mapException,
mapExceptional,
throw,
assert,
catch,
resolve,
merge,
alternative,
ExceptionalT(..),
fromMaybeT, toMaybeT,
fromEitherT, toEitherT,
fromExitCodeT, toExitCodeT,
liftT,
switchT,
forceT,
mapExceptionT,
mapExceptionalT,
throwT,
assertT,
catchT,
bracketT,
resolveT,
tryT,
manyT,
manyMonoidT,
mergeT,
alternativeT,
) where
import Control.Applicative (Applicative(pure, (<*>)))
import Control.Monad (Monad, return, liftM, liftM2, (>>=), (>>), (=<<),
)
import Control.Monad.Fix (MonadFix, mfix, )
import Control.Monad.Trans.Class (MonadTrans, lift, )
import Control.Monad.Trans.Maybe (MaybeT(MaybeT, runMaybeT))
import Control.DeepSeq (NFData, rnf, )
import Data.Functor (Functor, fmap, )
import Data.Monoid(Monoid, mappend, mempty, Endo(Endo, appEndo), )
import Data.Function (flip, const, (.), ($), )
import Data.Either (Either(Left, Right), either, )
import Data.Maybe (Maybe(Just, Nothing), maybe, )
import Data.Bool (Bool, )
import Data.Eq (Eq, )
import System.Exit (ExitCode(ExitSuccess, ExitFailure), )
import Prelude (Show, Int, )
data Exceptional e a =
Success a
| Exception e
deriving (Int -> Exceptional e a -> ShowS
[Exceptional e a] -> ShowS
Exceptional e a -> String
(Int -> Exceptional e a -> ShowS)
-> (Exceptional e a -> String)
-> ([Exceptional e a] -> ShowS)
-> Show (Exceptional e a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall e a. (Show a, Show e) => Int -> Exceptional e a -> ShowS
forall e a. (Show a, Show e) => [Exceptional e a] -> ShowS
forall e a. (Show a, Show e) => Exceptional e a -> String
$cshowsPrec :: forall e a. (Show a, Show e) => Int -> Exceptional e a -> ShowS
showsPrec :: Int -> Exceptional e a -> ShowS
$cshow :: forall e a. (Show a, Show e) => Exceptional e a -> String
show :: Exceptional e a -> String
$cshowList :: forall e a. (Show a, Show e) => [Exceptional e a] -> ShowS
showList :: [Exceptional e a] -> ShowS
Show, Exceptional e a -> Exceptional e a -> Bool
(Exceptional e a -> Exceptional e a -> Bool)
-> (Exceptional e a -> Exceptional e a -> Bool)
-> Eq (Exceptional e a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall e a.
(Eq a, Eq e) =>
Exceptional e a -> Exceptional e a -> Bool
$c== :: forall e a.
(Eq a, Eq e) =>
Exceptional e a -> Exceptional e a -> Bool
== :: Exceptional e a -> Exceptional e a -> Bool
$c/= :: forall e a.
(Eq a, Eq e) =>
Exceptional e a -> Exceptional e a -> Bool
/= :: Exceptional e a -> Exceptional e a -> Bool
Eq)
fromMaybe :: e -> Maybe a -> Exceptional e a
fromMaybe :: forall e a. e -> Maybe a -> Exceptional e a
fromMaybe e
e = Exceptional e a
-> (a -> Exceptional e a) -> Maybe a -> Exceptional e a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (e -> Exceptional e a
forall e a. e -> Exceptional e a
Exception e
e) a -> Exceptional e a
forall e a. a -> Exceptional e a
Success
fromEither :: Either e a -> Exceptional e a
fromEither :: forall e a. Either e a -> Exceptional e a
fromEither = (e -> Exceptional e a)
-> (a -> Exceptional e a) -> Either e a -> Exceptional e a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either e -> Exceptional e a
forall e a. e -> Exceptional e a
Exception a -> Exceptional e a
forall e a. a -> Exceptional e a
Success
toMaybe :: Exceptional e a -> Maybe a
toMaybe :: forall e a. Exceptional e a -> Maybe a
toMaybe = (e -> Maybe a) -> (a -> Maybe a) -> Exceptional e a -> Maybe a
forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b
switch (Maybe a -> e -> Maybe a
forall a b. a -> b -> a
const Maybe a
forall a. Maybe a
Nothing) a -> Maybe a
forall a. a -> Maybe a
Just
toEither :: Exceptional e a -> Either e a
toEither :: forall e a. Exceptional e a -> Either e a
toEither Exceptional e a
x =
case Exceptional e a
x of
Success a
a -> a -> Either e a
forall a b. b -> Either a b
Right a
a
Exception e
e -> e -> Either e a
forall a b. a -> Either a b
Left e
e
toExitCode :: Exceptional Int () -> ExitCode
toExitCode :: Exceptional Int () -> ExitCode
toExitCode Exceptional Int ()
e =
case Exceptional Int ()
e of
Success () -> ExitCode
ExitSuccess
Exception Int
n -> Int -> ExitCode
ExitFailure Int
n
fromExitCode :: ExitCode -> Exceptional Int ()
fromExitCode :: ExitCode -> Exceptional Int ()
fromExitCode ExitCode
e =
case ExitCode
e of
ExitCode
ExitSuccess -> () -> Exceptional Int ()
forall e a. a -> Exceptional e a
Success ()
ExitFailure Int
n -> Int -> Exceptional Int ()
forall e a. e -> Exceptional e a
Exception Int
n
getExceptionNull :: Exceptional e () -> Maybe e
getExceptionNull :: forall e. Exceptional e () -> Maybe e
getExceptionNull Exceptional e ()
x =
case Exceptional e ()
x of
Success ()
_ -> Maybe e
forall a. Maybe a
Nothing
Exception e
e -> e -> Maybe e
forall a. a -> Maybe a
Just e
e
switch :: (e -> b) -> (a -> b) -> Exceptional e a -> b
switch :: forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b
switch e -> b
f a -> b
g Exceptional e a
x =
case Exceptional e a
x of
Success a
a -> a -> b
g a
a
Exception e
e -> e -> b
f e
e
force :: Exceptional e a -> Exceptional e a
force :: forall e a. Exceptional e a -> Exceptional e a
force ~(Success a
a) = a -> Exceptional e a
forall e a. a -> Exceptional e a
Success a
a
mapException :: (e0 -> e1) -> Exceptional e0 a -> Exceptional e1 a
mapException :: forall e0 e1 a. (e0 -> e1) -> Exceptional e0 a -> Exceptional e1 a
mapException e0 -> e1
f Exceptional e0 a
x =
case Exceptional e0 a
x of
Success a
a -> a -> Exceptional e1 a
forall e a. a -> Exceptional e a
Success a
a
Exception e0
e -> e1 -> Exceptional e1 a
forall e a. e -> Exceptional e a
Exception (e0 -> e1
f e0
e)
mapExceptional :: (e0 -> e1) -> (a -> b) -> Exceptional e0 a -> Exceptional e1 b
mapExceptional :: forall e0 e1 a b.
(e0 -> e1) -> (a -> b) -> Exceptional e0 a -> Exceptional e1 b
mapExceptional e0 -> e1
f a -> b
g Exceptional e0 a
x =
case Exceptional e0 a
x of
Success a
a -> b -> Exceptional e1 b
forall e a. a -> Exceptional e a
Success (a -> b
g a
a)
Exception e0
e -> e1 -> Exceptional e1 b
forall e a. e -> Exceptional e a
Exception (e0 -> e1
f e0
e)
throw :: e -> Exceptional e a
throw :: forall e a. e -> Exceptional e a
throw = e -> Exceptional e a
forall e a. e -> Exceptional e a
Exception
assert :: e -> Bool -> Exceptional e ()
assert :: forall e. e -> Bool -> Exceptional e ()
assert e
e Bool
b =
if Bool
b then () -> Exceptional e ()
forall e a. a -> Exceptional e a
Success () else e -> Exceptional e ()
forall e a. e -> Exceptional e a
throw e
e
catch :: Exceptional e0 a -> (e0 -> Exceptional e1 a) -> Exceptional e1 a
catch :: forall e0 a e1.
Exceptional e0 a -> (e0 -> Exceptional e1 a) -> Exceptional e1 a
catch Exceptional e0 a
x e0 -> Exceptional e1 a
handler =
case Exceptional e0 a
x of
Success a
a -> a -> Exceptional e1 a
forall e a. a -> Exceptional e a
Success a
a
Exception e0
e -> e0 -> Exceptional e1 a
handler e0
e
resolve :: (e -> a) -> Exceptional e a -> a
resolve :: forall e a. (e -> a) -> Exceptional e a -> a
resolve e -> a
handler Exceptional e a
x =
case Exceptional e a
x of
Success a
a -> a
a
Exception e
e -> e -> a
handler e
e
infixl 3 `alternative`, `alternativeT`
alternative, _alternative ::
Exceptional e a -> Exceptional e a -> Exceptional e a
alternative :: forall e a. Exceptional e a -> Exceptional e a -> Exceptional e a
alternative Exceptional e a
x Exceptional e a
y = Exceptional e a -> (e -> Exceptional e a) -> Exceptional e a
forall e0 a e1.
Exceptional e0 a -> (e0 -> Exceptional e1 a) -> Exceptional e1 a
catch Exceptional e a
x (Exceptional e a -> e -> Exceptional e a
forall a b. a -> b -> a
const Exceptional e a
y)
_alternative :: forall e a. Exceptional e a -> Exceptional e a -> Exceptional e a
_alternative Exceptional e a
x Exceptional e a
y = (e -> Exceptional e a)
-> (a -> Exceptional e a) -> Exceptional e a -> Exceptional e a
forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b
switch (Exceptional e a -> e -> Exceptional e a
forall a b. a -> b -> a
const Exceptional e a
y) a -> Exceptional e a
forall e a. a -> Exceptional e a
Success Exceptional e a
x
infixl 4 `merge`, `mergeT`
merge, mergeLazy, _mergeStrict ::
(Monoid e) =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
merge :: forall e a b.
Monoid e =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
merge = Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
forall e a b.
Monoid e =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
mergeLazy
mergeLazy :: forall e a b.
Monoid e =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
mergeLazy Exceptional e (a -> b)
ef Exceptional e a
ea =
case Exceptional e (a -> b)
ef of
Exception e
e0 ->
e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception (e -> Exceptional e b) -> e -> Exceptional e b
forall a b. (a -> b) -> a -> b
$ e -> e -> e
forall a. Monoid a => a -> a -> a
mappend e
e0 (e -> e) -> e -> e
forall a b. (a -> b) -> a -> b
$
case Exceptional e a
ea of
Success a
_ -> e
forall a. Monoid a => a
mempty
Exception e
e1 -> e
e1
Success a -> b
f -> (a -> b) -> Exceptional e a -> Exceptional e b
forall a b. (a -> b) -> Exceptional e a -> Exceptional e b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Exceptional e a
ea
_mergeStrict :: forall e a b.
Monoid e =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
_mergeStrict Exceptional e (a -> b)
ef Exceptional e a
ea =
case (Exceptional e (a -> b)
ef,Exceptional e a
ea) of
(Success a -> b
f, Success a
a) -> b -> Exceptional e b
forall e a. a -> Exceptional e a
Success (b -> Exceptional e b) -> b -> Exceptional e b
forall a b. (a -> b) -> a -> b
$ a -> b
f a
a
(Exception e
e, Success a
_) -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
(Success a -> b
_, Exception e
e) -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
(Exception e
e0, Exception e
e1) -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception (e -> Exceptional e b) -> e -> Exceptional e b
forall a b. (a -> b) -> a -> b
$ e -> e -> e
forall a. Monoid a => a -> a -> a
mappend e
e0 e
e1
instance (NFData e, NFData a) => NFData (Exceptional e a) where
rnf :: Exceptional e a -> ()
rnf = (e -> ()) -> (a -> ()) -> Exceptional e a -> ()
forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b
switch e -> ()
forall a. NFData a => a -> ()
rnf a -> ()
forall a. NFData a => a -> ()
rnf
instance Functor (Exceptional e) where
fmap :: forall a b. (a -> b) -> Exceptional e a -> Exceptional e b
fmap a -> b
f Exceptional e a
x =
case Exceptional e a
x of
Success a
a -> b -> Exceptional e b
forall e a. a -> Exceptional e a
Success (a -> b
f a
a)
Exception e
e -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
instance Applicative (Exceptional e) where
pure :: forall a. a -> Exceptional e a
pure = a -> Exceptional e a
forall e a. a -> Exceptional e a
Success
Exceptional e (a -> b)
f <*> :: forall a b.
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
<*> Exceptional e a
x =
case Exceptional e (a -> b)
f of
Exception e
e -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
Success a -> b
g ->
case Exceptional e a
x of
Success a
a -> b -> Exceptional e b
forall e a. a -> Exceptional e a
Success (a -> b
g a
a)
Exception e
e -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
instance Monad (Exceptional e) where
return :: forall a. a -> Exceptional e a
return = a -> Exceptional e a
forall a. a -> Exceptional e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
Exceptional e a
x >>= :: forall a b.
Exceptional e a -> (a -> Exceptional e b) -> Exceptional e b
>>= a -> Exceptional e b
f =
case Exceptional e a
x of
Exception e
e -> e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e
Success a
y -> a -> Exceptional e b
f a
y
instance MonadFix (Exceptional e) where
mfix :: forall a. (a -> Exceptional e a) -> Exceptional e a
mfix a -> Exceptional e a
f =
let unSuccess :: Exceptional e a -> a
unSuccess ~(Success a
x) = a
x
a :: Exceptional e a
a = a -> Exceptional e a
f (Exceptional e a -> a
forall {e} {a}. Exceptional e a -> a
unSuccess Exceptional e a
a)
in Exceptional e a
a
newtype ExceptionalT e m a =
ExceptionalT {forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT :: m (Exceptional e a)}
_assertMaybeT :: (Monad m) => e -> Maybe a -> ExceptionalT e m a
_assertMaybeT :: forall (m :: * -> *) e a.
Monad m =>
e -> Maybe a -> ExceptionalT e m a
_assertMaybeT e
e = ExceptionalT e m a
-> (a -> ExceptionalT e m a) -> Maybe a -> ExceptionalT e m a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (e -> ExceptionalT e m a
forall (m :: * -> *) e a. Monad m => e -> ExceptionalT e m a
throwT e
e) a -> ExceptionalT e m a
forall a. a -> ExceptionalT e m a
forall (m :: * -> *) a. Monad m => a -> m a
return
fromMaybeT :: Monad m => e -> MaybeT m a -> ExceptionalT e m a
fromMaybeT :: forall (m :: * -> *) e a.
Monad m =>
e -> MaybeT m a -> ExceptionalT e m a
fromMaybeT e
e = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (MaybeT m a -> m (Exceptional e a))
-> MaybeT m a
-> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe a -> Exceptional e a) -> m (Maybe a) -> m (Exceptional e a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (e -> Maybe a -> Exceptional e a
forall e a. e -> Maybe a -> Exceptional e a
fromMaybe e
e) (m (Maybe a) -> m (Exceptional e a))
-> (MaybeT m a -> m (Maybe a)) -> MaybeT m a -> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MaybeT m a -> m (Maybe a)
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT
toMaybeT :: Monad m => ExceptionalT e m a -> MaybeT m a
toMaybeT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> MaybeT m a
toMaybeT = m (Maybe a) -> MaybeT m a
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe a) -> MaybeT m a)
-> (ExceptionalT e m a -> m (Maybe a))
-> ExceptionalT e m a
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exceptional e a -> Maybe a) -> m (Exceptional e a) -> m (Maybe a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Exceptional e a -> Maybe a
forall e a. Exceptional e a -> Maybe a
toMaybe (m (Exceptional e a) -> m (Maybe a))
-> (ExceptionalT e m a -> m (Exceptional e a))
-> ExceptionalT e m a
-> m (Maybe a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
fromEitherT :: Monad m => m (Either e a) -> ExceptionalT e m a
fromEitherT :: forall (m :: * -> *) e a.
Monad m =>
m (Either e a) -> ExceptionalT e m a
fromEitherT = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (m (Either e a) -> m (Exceptional e a))
-> m (Either e a)
-> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Either e a -> Exceptional e a)
-> m (Either e a) -> m (Exceptional e a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Either e a -> Exceptional e a
forall e a. Either e a -> Exceptional e a
fromEither
toEitherT :: Monad m => ExceptionalT e m a -> m (Either e a)
toEitherT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> m (Either e a)
toEitherT = (Exceptional e a -> Either e a)
-> m (Exceptional e a) -> m (Either e a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Exceptional e a -> Either e a
forall e a. Exceptional e a -> Either e a
toEither (m (Exceptional e a) -> m (Either e a))
-> (ExceptionalT e m a -> m (Exceptional e a))
-> ExceptionalT e m a
-> m (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
toExitCodeT ::
(Functor m) =>
ExceptionalT Int m () -> m ExitCode
toExitCodeT :: forall (m :: * -> *).
Functor m =>
ExceptionalT Int m () -> m ExitCode
toExitCodeT ExceptionalT Int m ()
act =
(Exceptional Int () -> ExitCode)
-> m (Exceptional Int ()) -> m ExitCode
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Exceptional Int () -> ExitCode
toExitCode (m (Exceptional Int ()) -> m ExitCode)
-> m (Exceptional Int ()) -> m ExitCode
forall a b. (a -> b) -> a -> b
$ ExceptionalT Int m () -> m (Exceptional Int ())
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT Int m ()
act
fromExitCodeT ::
(Functor m) =>
m ExitCode -> ExceptionalT Int m ()
fromExitCodeT :: forall (m :: * -> *).
Functor m =>
m ExitCode -> ExceptionalT Int m ()
fromExitCodeT m ExitCode
act =
m (Exceptional Int ()) -> ExceptionalT Int m ()
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional Int ()) -> ExceptionalT Int m ())
-> m (Exceptional Int ()) -> ExceptionalT Int m ()
forall a b. (a -> b) -> a -> b
$ (ExitCode -> Exceptional Int ())
-> m ExitCode -> m (Exceptional Int ())
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ExitCode -> Exceptional Int ()
fromExitCode m ExitCode
act
liftT :: (Monad m) => Exceptional e a -> ExceptionalT e m a
liftT :: forall (m :: * -> *) e a.
Monad m =>
Exceptional e a -> ExceptionalT e m a
liftT = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (Exceptional e a -> m (Exceptional e a))
-> Exceptional e a
-> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
switchT ::
(Monad m) =>
(e -> m b) -> (a -> m b) ->
ExceptionalT e m a -> m b
switchT :: forall (m :: * -> *) e b a.
Monad m =>
(e -> m b) -> (a -> m b) -> ExceptionalT e m a -> m b
switchT e -> m b
e a -> m b
s ExceptionalT e m a
m =
(e -> m b) -> (a -> m b) -> Exceptional e a -> m b
forall e b a. (e -> b) -> (a -> b) -> Exceptional e a -> b
switch e -> m b
e a -> m b
s (Exceptional e a -> m b) -> m (Exceptional e a) -> m b
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m a
m
forceT :: Monad m => ExceptionalT e m a -> ExceptionalT e m a
forceT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> ExceptionalT e m a
forceT =
m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (ExceptionalT e m a -> m (Exceptional e a))
-> ExceptionalT e m a
-> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exceptional e a -> Exceptional e a)
-> m (Exceptional e a) -> m (Exceptional e a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Exceptional e a -> Exceptional e a
forall e a. Exceptional e a -> Exceptional e a
force (m (Exceptional e a) -> m (Exceptional e a))
-> (ExceptionalT e m a -> m (Exceptional e a))
-> ExceptionalT e m a
-> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
mapExceptionT :: (Monad m) =>
(e0 -> e1) ->
ExceptionalT e0 m a ->
ExceptionalT e1 m a
mapExceptionT :: forall (m :: * -> *) e0 e1 a.
Monad m =>
(e0 -> e1) -> ExceptionalT e0 m a -> ExceptionalT e1 m a
mapExceptionT e0 -> e1
f =
m (Exceptional e1 a) -> ExceptionalT e1 m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e1 a) -> ExceptionalT e1 m a)
-> (ExceptionalT e0 m a -> m (Exceptional e1 a))
-> ExceptionalT e0 m a
-> ExceptionalT e1 m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Exceptional e0 a -> Exceptional e1 a)
-> m (Exceptional e0 a) -> m (Exceptional e1 a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((e0 -> e1) -> Exceptional e0 a -> Exceptional e1 a
forall e0 e1 a. (e0 -> e1) -> Exceptional e0 a -> Exceptional e1 a
mapException e0 -> e1
f) (m (Exceptional e0 a) -> m (Exceptional e1 a))
-> (ExceptionalT e0 m a -> m (Exceptional e0 a))
-> ExceptionalT e0 m a
-> m (Exceptional e1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionalT e0 m a -> m (Exceptional e0 a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
mapExceptionalT ::
(m (Exceptional e0 a) -> n (Exceptional e1 b)) ->
ExceptionalT e0 m a -> ExceptionalT e1 n b
mapExceptionalT :: forall (m :: * -> *) e0 a (n :: * -> *) e1 b.
(m (Exceptional e0 a) -> n (Exceptional e1 b))
-> ExceptionalT e0 m a -> ExceptionalT e1 n b
mapExceptionalT m (Exceptional e0 a) -> n (Exceptional e1 b)
f =
n (Exceptional e1 b) -> ExceptionalT e1 n b
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (n (Exceptional e1 b) -> ExceptionalT e1 n b)
-> (ExceptionalT e0 m a -> n (Exceptional e1 b))
-> ExceptionalT e0 m a
-> ExceptionalT e1 n b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (Exceptional e0 a) -> n (Exceptional e1 b)
f (m (Exceptional e0 a) -> n (Exceptional e1 b))
-> (ExceptionalT e0 m a -> m (Exceptional e0 a))
-> ExceptionalT e0 m a
-> n (Exceptional e1 b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExceptionalT e0 m a -> m (Exceptional e0 a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
throwT :: (Monad m) =>
e -> ExceptionalT e m a
throwT :: forall (m :: * -> *) e a. Monad m => e -> ExceptionalT e m a
throwT = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (e -> m (Exceptional e a)) -> e -> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e a -> m (Exceptional e a))
-> (e -> Exceptional e a) -> e -> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Exceptional e a
forall e a. e -> Exceptional e a
throw
assertT :: (Monad m) =>
e -> Bool -> ExceptionalT e m ()
assertT :: forall (m :: * -> *) e. Monad m => e -> Bool -> ExceptionalT e m ()
assertT e
e = m (Exceptional e ()) -> ExceptionalT e m ()
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e ()) -> ExceptionalT e m ())
-> (Bool -> m (Exceptional e ())) -> Bool -> ExceptionalT e m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exceptional e () -> m (Exceptional e ())
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e () -> m (Exceptional e ()))
-> (Bool -> Exceptional e ()) -> Bool -> m (Exceptional e ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Bool -> Exceptional e ()
forall e. e -> Bool -> Exceptional e ()
assert e
e
catchT :: (Monad m) =>
ExceptionalT e0 m a ->
(e0 -> ExceptionalT e1 m a) ->
ExceptionalT e1 m a
catchT :: forall (m :: * -> *) e0 a e1.
Monad m =>
ExceptionalT e0 m a
-> (e0 -> ExceptionalT e1 m a) -> ExceptionalT e1 m a
catchT ExceptionalT e0 m a
action e0 -> ExceptionalT e1 m a
handler =
m (Exceptional e1 a) -> ExceptionalT e1 m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e1 a) -> ExceptionalT e1 m a)
-> m (Exceptional e1 a) -> ExceptionalT e1 m a
forall a b. (a -> b) -> a -> b
$ (e0 -> m (Exceptional e1 a))
-> (a -> m (Exceptional e1 a))
-> ExceptionalT e0 m a
-> m (Exceptional e1 a)
forall (m :: * -> *) e b a.
Monad m =>
(e -> m b) -> (a -> m b) -> ExceptionalT e m a -> m b
switchT (ExceptionalT e1 m a -> m (Exceptional e1 a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT (ExceptionalT e1 m a -> m (Exceptional e1 a))
-> (e0 -> ExceptionalT e1 m a) -> e0 -> m (Exceptional e1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e0 -> ExceptionalT e1 m a
handler) (Exceptional e1 a -> m (Exceptional e1 a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e1 a -> m (Exceptional e1 a))
-> (a -> Exceptional e1 a) -> a -> m (Exceptional e1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Exceptional e1 a
forall e a. a -> Exceptional e a
Success) ExceptionalT e0 m a
action
bracketT :: (Monad m) =>
ExceptionalT e m h ->
(h -> ExceptionalT e m ()) ->
(h -> ExceptionalT e m a) ->
ExceptionalT e m a
bracketT :: forall (m :: * -> *) e h a.
Monad m =>
ExceptionalT e m h
-> (h -> ExceptionalT e m ())
-> (h -> ExceptionalT e m a)
-> ExceptionalT e m a
bracketT ExceptionalT e m h
open h -> ExceptionalT e m ()
close h -> ExceptionalT e m a
action =
ExceptionalT e m h
open ExceptionalT e m h
-> (h -> ExceptionalT e m a) -> ExceptionalT e m a
forall a b.
ExceptionalT e m a
-> (a -> ExceptionalT e m b) -> ExceptionalT e m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \h
h ->
m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> m (Exceptional e a) -> ExceptionalT e m a
forall a b. (a -> b) -> a -> b
$
do Exceptional e a
a <- ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT (h -> ExceptionalT e m a
action h
h)
Exceptional e ()
c <- ExceptionalT e m () -> m (Exceptional e ())
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT (h -> ExceptionalT e m ()
close h
h)
Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e a
a Exceptional e a -> (a -> Exceptional e a) -> Exceptional e a
forall a b.
Exceptional e a -> (a -> Exceptional e b) -> Exceptional e b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \a
r -> Exceptional e ()
c Exceptional e () -> Exceptional e a -> Exceptional e a
forall a b. Exceptional e a -> Exceptional e b -> Exceptional e b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> Exceptional e a
forall a. a -> Exceptional e a
forall (m :: * -> *) a. Monad m => a -> m a
return a
r)
resolveT :: (Monad m) =>
(e -> m a) -> ExceptionalT e m a -> m a
resolveT :: forall (m :: * -> *) e a.
Monad m =>
(e -> m a) -> ExceptionalT e m a -> m a
resolveT e -> m a
handler ExceptionalT e m a
x =
do Exceptional e a
r <- ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m a
x
(e -> m a) -> Exceptional e (m a) -> m a
forall e a. (e -> a) -> Exceptional e a -> a
resolve e -> m a
handler ((a -> m a) -> Exceptional e a -> Exceptional e (m a)
forall a b. (a -> b) -> Exceptional e a -> Exceptional e b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Exceptional e a
r)
tryT :: (Monad m) =>
ExceptionalT e m a -> m (Exceptional e a)
tryT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> m (Exceptional e a)
tryT = ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT
manyT :: (Monad m) =>
(e0 -> Maybe e1) ->
(a -> b -> b) ->
b ->
ExceptionalT e0 m a ->
ExceptionalT e1 m b
manyT :: forall (m :: * -> *) e0 e1 a b.
Monad m =>
(e0 -> Maybe e1)
-> (a -> b -> b) -> b -> ExceptionalT e0 m a -> ExceptionalT e1 m b
manyT e0 -> Maybe e1
handler a -> b -> b
cons b
empty ExceptionalT e0 m a
action =
(Endo b -> b) -> ExceptionalT e1 m (Endo b) -> ExceptionalT e1 m b
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((Endo b -> b -> b) -> b -> Endo b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip Endo b -> b -> b
forall a. Endo a -> a -> a
appEndo b
empty) (ExceptionalT e1 m (Endo b) -> ExceptionalT e1 m b)
-> ExceptionalT e1 m (Endo b) -> ExceptionalT e1 m b
forall a b. (a -> b) -> a -> b
$
(e0 -> Maybe e1)
-> ExceptionalT e0 m (Endo b) -> ExceptionalT e1 m (Endo b)
forall (m :: * -> *) a e0 e1.
(Monad m, Monoid a) =>
(e0 -> Maybe e1) -> ExceptionalT e0 m a -> ExceptionalT e1 m a
manyMonoidT e0 -> Maybe e1
handler (ExceptionalT e0 m (Endo b) -> ExceptionalT e1 m (Endo b))
-> ExceptionalT e0 m (Endo b) -> ExceptionalT e1 m (Endo b)
forall a b. (a -> b) -> a -> b
$
(a -> Endo b) -> ExceptionalT e0 m a -> ExceptionalT e0 m (Endo b)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((b -> b) -> Endo b
forall a. (a -> a) -> Endo a
Endo ((b -> b) -> Endo b) -> (a -> b -> b) -> a -> Endo b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b -> b
cons) ExceptionalT e0 m a
action
manyMonoidT :: (Monad m, Monoid a) =>
(e0 -> Maybe e1) ->
ExceptionalT e0 m a ->
ExceptionalT e1 m a
manyMonoidT :: forall (m :: * -> *) a e0 e1.
(Monad m, Monoid a) =>
(e0 -> Maybe e1) -> ExceptionalT e0 m a -> ExceptionalT e1 m a
manyMonoidT e0 -> Maybe e1
handler ExceptionalT e0 m a
action =
let recourse :: ExceptionalT e1 m a
recourse =
do Exceptional e0 a
r <- m (Exceptional e0 a) -> ExceptionalT e1 m (Exceptional e0 a)
forall (m :: * -> *) a. Monad m => m a -> ExceptionalT e1 m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Exceptional e0 a) -> ExceptionalT e1 m (Exceptional e0 a))
-> m (Exceptional e0 a) -> ExceptionalT e1 m (Exceptional e0 a)
forall a b. (a -> b) -> a -> b
$ ExceptionalT e0 m a -> m (Exceptional e0 a)
forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> m (Exceptional e a)
tryT ExceptionalT e0 m a
action
case Exceptional e0 a
r of
Exception e0
e -> m (Exceptional e1 a) -> ExceptionalT e1 m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e1 a) -> ExceptionalT e1 m a)
-> m (Exceptional e1 a) -> ExceptionalT e1 m a
forall a b. (a -> b) -> a -> b
$ Exceptional e1 a -> m (Exceptional e1 a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e1 a -> m (Exceptional e1 a))
-> Exceptional e1 a -> m (Exceptional e1 a)
forall a b. (a -> b) -> a -> b
$ Exceptional e1 a
-> (e1 -> Exceptional e1 a) -> Maybe e1 -> Exceptional e1 a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (a -> Exceptional e1 a
forall e a. a -> Exceptional e a
Success a
forall a. Monoid a => a
mempty) e1 -> Exceptional e1 a
forall e a. e -> Exceptional e a
throw (e0 -> Maybe e1
handler e0
e)
Success a
x -> (a -> a) -> ExceptionalT e1 m a -> ExceptionalT e1 m a
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (a -> a -> a
forall a. Monoid a => a -> a -> a
mappend a
x) ExceptionalT e1 m a
recourse
in ExceptionalT e1 m a
recourse
mergeT ::
(Monoid e, Monad m) =>
ExceptionalT e m (a -> b) ->
ExceptionalT e m a ->
ExceptionalT e m b
mergeT :: forall e (m :: * -> *) a b.
(Monoid e, Monad m) =>
ExceptionalT e m (a -> b)
-> ExceptionalT e m a -> ExceptionalT e m b
mergeT ExceptionalT e m (a -> b)
mf ExceptionalT e m a
ma =
m (Exceptional e b) -> ExceptionalT e m b
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e b) -> ExceptionalT e m b)
-> m (Exceptional e b) -> ExceptionalT e m b
forall a b. (a -> b) -> a -> b
$
(Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b)
-> m (Exceptional e (a -> b))
-> m (Exceptional e a)
-> m (Exceptional e b)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
forall e a b.
Monoid e =>
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
merge (ExceptionalT e m (a -> b) -> m (Exceptional e (a -> b))
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m (a -> b)
mf) (ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m a
ma)
alternativeT, _alternativeT ::
(Monad m) =>
ExceptionalT e m a -> ExceptionalT e m a -> ExceptionalT e m a
alternativeT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> ExceptionalT e m a -> ExceptionalT e m a
alternativeT ExceptionalT e m a
x ExceptionalT e m a
y = ExceptionalT e m a
-> (e -> ExceptionalT e m a) -> ExceptionalT e m a
forall (m :: * -> *) e0 a e1.
Monad m =>
ExceptionalT e0 m a
-> (e0 -> ExceptionalT e1 m a) -> ExceptionalT e1 m a
catchT ExceptionalT e m a
x (ExceptionalT e m a -> e -> ExceptionalT e m a
forall a b. a -> b -> a
const ExceptionalT e m a
y)
_alternativeT :: forall (m :: * -> *) e a.
Monad m =>
ExceptionalT e m a -> ExceptionalT e m a -> ExceptionalT e m a
_alternativeT ExceptionalT e m a
x ExceptionalT e m a
y =
m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> m (Exceptional e a) -> ExceptionalT e m a
forall a b. (a -> b) -> a -> b
$ (e -> m (Exceptional e a))
-> (a -> m (Exceptional e a))
-> ExceptionalT e m a
-> m (Exceptional e a)
forall (m :: * -> *) e b a.
Monad m =>
(e -> m b) -> (a -> m b) -> ExceptionalT e m a -> m b
switchT (m (Exceptional e a) -> e -> m (Exceptional e a)
forall a b. a -> b -> a
const (m (Exceptional e a) -> e -> m (Exceptional e a))
-> m (Exceptional e a) -> e -> m (Exceptional e a)
forall a b. (a -> b) -> a -> b
$ ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m a
y) (Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e a -> m (Exceptional e a))
-> (a -> Exceptional e a) -> a -> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Exceptional e a
forall e a. a -> Exceptional e a
Success) ExceptionalT e m a
x
instance Functor m => Functor (ExceptionalT e m) where
fmap :: forall a b. (a -> b) -> ExceptionalT e m a -> ExceptionalT e m b
fmap a -> b
f (ExceptionalT m (Exceptional e a)
x) =
m (Exceptional e b) -> ExceptionalT e m b
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT ((Exceptional e a -> Exceptional e b)
-> m (Exceptional e a) -> m (Exceptional e b)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> Exceptional e a -> Exceptional e b
forall a b. (a -> b) -> Exceptional e a -> Exceptional e b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) m (Exceptional e a)
x)
instance Applicative m => Applicative (ExceptionalT e m) where
pure :: forall a. a -> ExceptionalT e m a
pure = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (a -> m (Exceptional e a)) -> a -> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Exceptional e a -> m (Exceptional e a))
-> (a -> Exceptional e a) -> a -> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Exceptional e a
forall a. a -> Exceptional e a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
ExceptionalT m (Exceptional e (a -> b))
f <*> :: forall a b.
ExceptionalT e m (a -> b)
-> ExceptionalT e m a -> ExceptionalT e m b
<*> ExceptionalT m (Exceptional e a)
x =
m (Exceptional e b) -> ExceptionalT e m b
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT ((Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b)
-> m (Exceptional e (a -> b))
-> m (Exceptional e a -> Exceptional e b)
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
forall a b.
Exceptional e (a -> b) -> Exceptional e a -> Exceptional e b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
(<*>) m (Exceptional e (a -> b))
f m (Exceptional e a -> Exceptional e b)
-> m (Exceptional e a) -> m (Exceptional e b)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m (Exceptional e a)
x)
instance Monad m => Monad (ExceptionalT e m) where
return :: forall a. a -> ExceptionalT e m a
return = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> (a -> m (Exceptional e a)) -> a -> ExceptionalT e m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Exceptional e a -> m (Exceptional e a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Exceptional e a -> m (Exceptional e a))
-> (a -> Exceptional e a) -> a -> m (Exceptional e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Exceptional e a
forall a. a -> Exceptional e a
forall (m :: * -> *) a. Monad m => a -> m a
return
ExceptionalT e m a
x0 >>= :: forall a b.
ExceptionalT e m a
-> (a -> ExceptionalT e m b) -> ExceptionalT e m b
>>= a -> ExceptionalT e m b
f =
m (Exceptional e b) -> ExceptionalT e m b
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e b) -> ExceptionalT e m b)
-> m (Exceptional e b) -> ExceptionalT e m b
forall a b. (a -> b) -> a -> b
$
ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT ExceptionalT e m a
x0 m (Exceptional e a)
-> (Exceptional e a -> m (Exceptional e b)) -> m (Exceptional e b)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Exceptional e a
x1 ->
case Exceptional e a
x1 of
Exception e
e -> Exceptional e b -> m (Exceptional e b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (e -> Exceptional e b
forall e a. e -> Exceptional e a
Exception e
e)
Success a
x -> ExceptionalT e m b -> m (Exceptional e b)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT (ExceptionalT e m b -> m (Exceptional e b))
-> ExceptionalT e m b -> m (Exceptional e b)
forall a b. (a -> b) -> a -> b
$ a -> ExceptionalT e m b
f a
x
instance (MonadFix m) => MonadFix (ExceptionalT e m) where
mfix :: forall a. (a -> ExceptionalT e m a) -> ExceptionalT e m a
mfix a -> ExceptionalT e m a
f = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> m (Exceptional e a) -> ExceptionalT e m a
forall a b. (a -> b) -> a -> b
$ (Exceptional e a -> m (Exceptional e a)) -> m (Exceptional e a)
forall a. (a -> m a) -> m a
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix ((Exceptional e a -> m (Exceptional e a)) -> m (Exceptional e a))
-> (Exceptional e a -> m (Exceptional e a)) -> m (Exceptional e a)
forall a b. (a -> b) -> a -> b
$ \ ~(Success a
r) -> ExceptionalT e m a -> m (Exceptional e a)
forall e (m :: * -> *) a. ExceptionalT e m a -> m (Exceptional e a)
runExceptionalT (ExceptionalT e m a -> m (Exceptional e a))
-> ExceptionalT e m a -> m (Exceptional e a)
forall a b. (a -> b) -> a -> b
$ a -> ExceptionalT e m a
f a
r
instance MonadTrans (ExceptionalT e) where
lift :: forall (m :: * -> *) a. Monad m => m a -> ExceptionalT e m a
lift m a
m = m (Exceptional e a) -> ExceptionalT e m a
forall e (m :: * -> *) a. m (Exceptional e a) -> ExceptionalT e m a
ExceptionalT (m (Exceptional e a) -> ExceptionalT e m a)
-> m (Exceptional e a) -> ExceptionalT e m a
forall a b. (a -> b) -> a -> b
$ (a -> Exceptional e a) -> m a -> m (Exceptional e a)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM a -> Exceptional e a
forall e a. a -> Exceptional e a
Success m a
m