module Data.Stream.Recursive.Except where
import Control.Monad.Trans.Class
import Control.Monad.Trans.Except (ExceptT, runExceptT)
import Data.Stream.Recursive (Recursive (..))
import Data.Stream.Result (mapResultState)
handleExceptT :: (Monad m) => Recursive (ExceptT e1 m) b -> (e1 -> Recursive (ExceptT e2 m) b) -> Recursive (ExceptT e2 m) b
handleExceptT :: forall (m :: Type -> Type) e1 b e2.
Monad m =>
Recursive (ExceptT e1 m) b
-> (e1 -> Recursive (ExceptT e2 m) b) -> Recursive (ExceptT e2 m) b
handleExceptT Recursive (ExceptT e1 m) b
recursive e1 -> Recursive (ExceptT e2 m) b
handler = Recursive (ExceptT e1 m) b -> Recursive (ExceptT e2 m) b
go Recursive (ExceptT e1 m) b
recursive
where
go :: Recursive (ExceptT e1 m) b -> Recursive (ExceptT e2 m) b
go Recursive (ExceptT e1 m) b
recursive = ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
-> Recursive (ExceptT e2 m) b
forall (m :: Type -> Type) a.
m (Result (Recursive m a) a) -> Recursive m a
Recursive (ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
-> Recursive (ExceptT e2 m) b)
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
-> Recursive (ExceptT e2 m) b
forall a b. (a -> b) -> a -> b
$ do
Either e1 (Result (Recursive (ExceptT e1 m) b) b)
resultOrException <- m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
-> ExceptT e2 m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
forall (m :: Type -> Type) a. Monad m => m a -> ExceptT e2 m a
forall (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
-> ExceptT
e2 m (Either e1 (Result (Recursive (ExceptT e1 m) b) b)))
-> m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
-> ExceptT e2 m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
forall a b. (a -> b) -> a -> b
$ ExceptT e1 m (Result (Recursive (ExceptT e1 m) b) b)
-> m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
forall e (m :: Type -> Type) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT e1 m (Result (Recursive (ExceptT e1 m) b) b)
-> m (Either e1 (Result (Recursive (ExceptT e1 m) b) b)))
-> ExceptT e1 m (Result (Recursive (ExceptT e1 m) b) b)
-> m (Either e1 (Result (Recursive (ExceptT e1 m) b) b))
forall a b. (a -> b) -> a -> b
$ Recursive (ExceptT e1 m) b
-> ExceptT e1 m (Result (Recursive (ExceptT e1 m) b) b)
forall (m :: Type -> Type) a.
Recursive m a -> m (Result (Recursive m a) a)
getRecursive Recursive (ExceptT e1 m) b
recursive
case Either e1 (Result (Recursive (ExceptT e1 m) b) b)
resultOrException of
Right Result (Recursive (ExceptT e1 m) b) b
result -> Result (Recursive (ExceptT e2 m) b) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
forall a. a -> ExceptT e2 m a
forall (m :: Type -> Type) a. Monad m => a -> m a
return (Result (Recursive (ExceptT e2 m) b) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b))
-> Result (Recursive (ExceptT e2 m) b) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
forall a b. (a -> b) -> a -> b
$! (Recursive (ExceptT e1 m) b -> Recursive (ExceptT e2 m) b)
-> Result (Recursive (ExceptT e1 m) b) b
-> Result (Recursive (ExceptT e2 m) b) b
forall s1 s2 a. (s1 -> s2) -> Result s1 a -> Result s2 a
mapResultState Recursive (ExceptT e1 m) b -> Recursive (ExceptT e2 m) b
go Result (Recursive (ExceptT e1 m) b) b
result
Left e1
e -> Recursive (ExceptT e2 m) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
forall (m :: Type -> Type) a.
Recursive m a -> m (Result (Recursive m a) a)
getRecursive (Recursive (ExceptT e2 m) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b))
-> Recursive (ExceptT e2 m) b
-> ExceptT e2 m (Result (Recursive (ExceptT e2 m) b) b)
forall a b. (a -> b) -> a -> b
$ e1 -> Recursive (ExceptT e2 m) b
handler e1
e