module Control.Monad.Trans.Error
  ( mapErrorT
  -- * Reexports
  , module Control.Monad.Trans.Error.Class
  ) where

import           Control.Monad.Raise
import           Control.Monad.Rescue.Constraint
import           Control.Monad.Trans.Error.Class

import           Data.WorldPeace

mapErrorT
  :: ( MonadTransError t sourceErrs m
     , MonadRaise     (t targetErrs m)
     , CheckErrors    (t targetErrs m)
     )
  => (OpenUnion (Errors (t sourceErrs m)) -> OpenUnion (Errors (t targetErrs m)))
  -> t sourceErrs m a
  -> t targetErrs m a
mapErrorT :: (OpenUnion (Errors (t sourceErrs m))
 -> OpenUnion (Errors (t targetErrs m)))
-> t sourceErrs m a -> t targetErrs m a
mapErrorT OpenUnion (Errors (t sourceErrs m))
-> OpenUnion (Errors (t targetErrs m))
f = (OpenUnion (Errors (t sourceErrs m)) -> t targetErrs m a)
-> t sourceErrs m a -> t targetErrs m a
forall (t :: [*] -> (* -> *) -> * -> *) (sourceErrs :: [*])
       (m :: * -> *) (targetErrs :: [*]) a.
MonadTransError t sourceErrs m =>
(OpenUnion (Errors (t sourceErrs m)) -> t targetErrs m a)
-> t sourceErrs m a -> t targetErrs m a
onRaise (OpenUnion (Errors (t targetErrs m)) -> t targetErrs m a
forall (m :: * -> *) err a.
(MonadRaise m, Subset err (ErrorCase m)) =>
err -> m a
raise (OpenUnion (Errors (t targetErrs m)) -> t targetErrs m a)
-> (OpenUnion (Errors (t sourceErrs m))
    -> OpenUnion (Errors (t targetErrs m)))
-> OpenUnion (Errors (t sourceErrs m))
-> t targetErrs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OpenUnion (Errors (t sourceErrs m))
-> OpenUnion (Errors (t targetErrs m))
f)