module Control.Foldl.Exceptions
(
exHalt_, exHalt
, exSkip_, exSkip
) where
import Control.Foldl
import Control.Exception.Safe (Exception, MonadCatch, SomeException, try)
exHalt_ :: forall m a b.
(Monad m, MonadCatch m) => FoldM m a b -> FoldM m a b
exHalt_ :: forall (m :: * -> *) a b.
(Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a b
exHalt_ FoldM m a b
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> b
snd (forall e (m :: * -> *) a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a (Maybe e, b)
exHalt @SomeException FoldM m a b
f)
exHalt :: forall e m a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a (Maybe e, b)
exHalt :: forall e (m :: * -> *) a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a (Maybe e, b)
exHalt (FoldM x -> a -> m x
step m x
begin x -> m b
done) = forall (m :: * -> *) a b x.
(x -> a -> m x) -> m x -> (x -> m b) -> FoldM m a b
FoldM forall {a}. Exception a => (Maybe a, x) -> a -> m (Maybe a, x)
step' forall {a}. m (Maybe a, x)
begin' forall {a}. (a, x) -> m (a, b)
done'
where
begin' :: m (Maybe a, x)
begin' =
do
x
y <- m x
begin
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Maybe a
Nothing, x
y)
step' :: (Maybe a, x) -> a -> m (Maybe a, x)
step' x' :: (Maybe a, x)
x'@(Just a
_, x
_) a
_ = forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a, x)
x'
step' (Maybe a
Nothing, x
x1) a
a =
do
Either a x
x2Either <- forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> m (Either e a)
try (x -> a -> m x
step x
x1 a
a)
case Either a x
x2Either of
Left a
e -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just a
e, x
x1)
Right x
x2 -> forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. Maybe a
Nothing, x
x2)
done' :: (a, x) -> m (a, b)
done' (a
eMaybe, x
x) =
do
b
b <- x -> m b
done x
x
forall (m :: * -> *) a. Monad m => a -> m a
return (a
eMaybe, b
b)
exSkip_ :: forall m a b.
(Monad m, MonadCatch m) => FoldM m a b -> FoldM m a b
exSkip_ :: forall (m :: * -> *) a b.
(Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a b
exSkip_ FoldM m a b
f = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> b
snd (forall e (m :: * -> *) a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a ([e], b)
exSkip @SomeException FoldM m a b
f)
exSkip :: forall e m a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a ([e], b)
exSkip :: forall e (m :: * -> *) a b.
(Exception e, Monad m, MonadCatch m) =>
FoldM m a b -> FoldM m a ([e], b)
exSkip (FoldM x -> a -> m x
step m x
begin x -> m b
done) = forall (m :: * -> *) a b x.
(x -> a -> m x) -> m x -> (x -> m b) -> FoldM m a b
FoldM forall {a} {c}.
Exception a =>
([a] -> c, x) -> a -> m ([a] -> c, x)
step' forall {a}. m (a -> a, x)
begin' forall {a} {a}. ([a] -> a, x) -> m (a, b)
done'
where
begin' :: m (a -> a, x)
begin' =
do
x
y <- m x
begin
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> a
id, x
y)
step' :: ([a] -> c, x) -> a -> m ([a] -> c, x)
step' ([a] -> c
es, x
x1) a
a =
do
Either a x
x2Either <- forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> m (Either e a)
try (x -> a -> m x
step x
x1 a
a)
case Either a x
x2Either of
Left a
e -> forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> c
es forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
e forall a. a -> [a] -> [a]
:), x
x1)
Right x
x2 -> forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> c
es, x
x2)
done' :: ([a] -> a, x) -> m (a, b)
done' ([a] -> a
es, x
x) =
do
b
b <- x -> m b
done x
x
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> a
es [], b
b)