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_ :: FoldM m a b -> FoldM m a b
exHalt_ FoldM m a b
f = ((Maybe SomeException, b) -> b)
-> FoldM m a (Maybe SomeException, b) -> FoldM m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Maybe SomeException, b) -> b
forall a b. (a, b) -> b
snd (FoldM m a b -> FoldM m a (Maybe SomeException, b)
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 :: FoldM m a b -> FoldM m a (Maybe e, b)
exHalt (FoldM x -> a -> m x
step m x
begin x -> m b
done) = ((Maybe e, x) -> a -> m (Maybe e, x))
-> m (Maybe e, x)
-> ((Maybe e, x) -> m (Maybe e, b))
-> FoldM m a (Maybe e, b)
forall (m :: * -> *) a b x.
(x -> a -> m x) -> m x -> (x -> m b) -> FoldM m a b
FoldM (Maybe e, x) -> a -> m (Maybe e, x)
forall a. Exception a => (Maybe a, x) -> a -> m (Maybe a, x)
step' m (Maybe e, x)
forall a. m (Maybe a, x)
begin' (Maybe e, x) -> m (Maybe e, b)
forall a. (a, x) -> m (a, b)
done'
where
begin' :: m (Maybe a, x)
begin' =
do
x
y <- m x
begin
(Maybe a, x) -> m (Maybe a, x)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a
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
_ = (Maybe a, x) -> m (Maybe a, x)
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 <- m x -> m (Either a x)
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 -> (Maybe a, x) -> m (Maybe a, x)
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> Maybe a
forall a. a -> Maybe a
Just a
e, x
x1)
Right x
x2 -> (Maybe a, x) -> m (Maybe a, x)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe a
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
(a, b) -> m (a, b)
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_ :: FoldM m a b -> FoldM m a b
exSkip_ FoldM m a b
f = (([SomeException], b) -> b)
-> FoldM m a ([SomeException], b) -> FoldM m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([SomeException], b) -> b
forall a b. (a, b) -> b
snd (FoldM m a b -> FoldM m a ([SomeException], b)
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 :: FoldM m a b -> FoldM m a ([e], b)
exSkip (FoldM x -> a -> m x
step m x
begin x -> m b
done) = (([e] -> [e], x) -> a -> m ([e] -> [e], x))
-> m ([e] -> [e], x)
-> (([e] -> [e], x) -> m ([e], b))
-> FoldM m a ([e], b)
forall (m :: * -> *) a b x.
(x -> a -> m x) -> m x -> (x -> m b) -> FoldM m a b
FoldM ([e] -> [e], x) -> a -> m ([e] -> [e], x)
forall a c. Exception a => ([a] -> c, x) -> a -> m ([a] -> c, x)
step' m ([e] -> [e], x)
forall a. m (a -> a, x)
begin' ([e] -> [e], x) -> m ([e], b)
forall a a. ([a] -> a, x) -> m (a, b)
done'
where
begin' :: m (a -> a, x)
begin' =
do
x
y <- m x
begin
(a -> a, x) -> m (a -> a, x)
forall (m :: * -> *) a. Monad m => a -> m a
return (a -> a
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 <- m x -> m (Either a x)
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 -> ([a] -> c, x) -> m ([a] -> c, x)
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> c
es ([a] -> c) -> ([a] -> [a]) -> [a] -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
e a -> [a] -> [a]
forall a. a -> [a] -> [a]
:), x
x1)
Right x
x2 -> ([a] -> c, x) -> m ([a] -> c, x)
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
(a, b) -> m (a, b)
forall (m :: * -> *) a. Monad m => a -> m a
return ([a] -> a
es [], b
b)