{-# LANGUAGE ApplicativeDo         #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE LambdaCase            #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE UndecidableInstances  #-}

-- | The 'RescueT' transformer
module Control.Monad.Trans.Rescue.Types
  ( RescueT (..)
  , Rescue
  , runRescue
  ) where

import           Control.Monad.Base
import           Control.Monad.Catch
import           Control.Monad.Cont
import           Control.Monad.Fix
import           Control.Monad.Reader
import           Control.Monad.Rescue
import           Control.Monad.Trans.Error.Class

import           Data.Functor.Identity
import           Data.WorldPeace

-- | Add type-directed error handling abilities to a 'Monad'
newtype RescueT errs m a
  = RescueT { RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT :: m (Either (OpenUnion errs) a) }

-- | A specialized version of 'RescueT' to be used without a transfromer stack
type Rescue errs = RescueT errs Identity

runRescue :: Rescue errs a -> Either (OpenUnion errs) a
runRescue :: Rescue errs a -> Either (OpenUnion errs) a
runRescue = Identity (Either (OpenUnion errs) a) -> Either (OpenUnion errs) a
forall a. Identity a -> a
runIdentity (Identity (Either (OpenUnion errs) a) -> Either (OpenUnion errs) a)
-> (Rescue errs a -> Identity (Either (OpenUnion errs) a))
-> Rescue errs a
-> Either (OpenUnion errs) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rescue errs a -> Identity (Either (OpenUnion errs) a)
forall (errs :: [*]) (m :: * -> *) a.
RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT

mapRescueT
  :: (  n (Either (OpenUnion errs)  a)
     -> m (Either (OpenUnion errs') b)
     )
  -> RescueT errs  n a
  -> RescueT errs' m b
mapRescueT :: (n (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs') b))
-> RescueT errs n a -> RescueT errs' m b
mapRescueT n (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs') b)
f (RescueT n (Either (OpenUnion errs) a)
n) = m (Either (OpenUnion errs') b) -> RescueT errs' m b
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs') b) -> RescueT errs' m b)
-> m (Either (OpenUnion errs') b) -> RescueT errs' m b
forall a b. (a -> b) -> a -> b
$ n (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs') b)
f n (Either (OpenUnion errs) a)
n

instance Eq (m (Either (OpenUnion errs) a)) => Eq (RescueT errs m a) where
  RescueT m (Either (OpenUnion errs) a)
a == :: RescueT errs m a -> RescueT errs m a -> Bool
== RescueT m (Either (OpenUnion errs) a)
b = m (Either (OpenUnion errs) a)
a m (Either (OpenUnion errs) a)
-> m (Either (OpenUnion errs) a) -> Bool
forall a. Eq a => a -> a -> Bool
== m (Either (OpenUnion errs) a)
b

instance Show (m (Either (OpenUnion errs) a)) => Show (RescueT errs m a) where
  show :: RescueT errs m a -> String
show (RescueT m (Either (OpenUnion errs) a)
inner) = String
"RescueT (" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> m (Either (OpenUnion errs) a) -> String
forall a. Show a => a -> String
show m (Either (OpenUnion errs) a)
inner String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"

instance Functor m => Functor (RescueT errs m) where
  fmap :: (a -> b) -> RescueT errs m a -> RescueT errs m b
fmap a -> b
f (RescueT m (Either (OpenUnion errs) a)
inner) = m (Either (OpenUnion errs) b) -> RescueT errs m b
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) b) -> RescueT errs m b)
-> m (Either (OpenUnion errs) b) -> RescueT errs m b
forall a b. (a -> b) -> a -> b
$ (Either (OpenUnion errs) a -> Either (OpenUnion errs) b)
-> m (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs) b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> Either (OpenUnion errs) a -> Either (OpenUnion errs) b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f) m (Either (OpenUnion errs) a)
inner

instance Applicative m => Applicative (RescueT errs m) where
  pure :: a -> RescueT errs m a
pure = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) a) -> RescueT errs m a)
-> (a -> m (Either (OpenUnion errs) a)) -> a -> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
-> (a -> Either (OpenUnion errs) a)
-> a
-> m (Either (OpenUnion errs) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Either (OpenUnion errs) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
  (RescueT m (Either (OpenUnion errs) (a -> b))
fs) <*> :: RescueT errs m (a -> b) -> RescueT errs m a -> RescueT errs m b
<*> (RescueT m (Either (OpenUnion errs) a)
xs) = m (Either (OpenUnion errs) b) -> RescueT errs m b
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) b) -> RescueT errs m b)
-> m (Either (OpenUnion errs) b) -> RescueT errs m b
forall a b. (a -> b) -> a -> b
$ do
    Either (OpenUnion errs) (a -> b)
innerFs <- m (Either (OpenUnion errs) (a -> b))
fs
    Either (OpenUnion errs) a
innerXs <- m (Either (OpenUnion errs) a)
xs
    return (Either (OpenUnion errs) (a -> b)
innerFs Either (OpenUnion errs) (a -> b)
-> Either (OpenUnion errs) a -> Either (OpenUnion errs) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Either (OpenUnion errs) a
innerXs)

instance Monad m => Monad (RescueT errs m) where
  RescueT m (Either (OpenUnion errs) a)
action >>= :: RescueT errs m a -> (a -> RescueT errs m b) -> RescueT errs m b
>>= a -> RescueT errs m b
k = m (Either (OpenUnion errs) b) -> RescueT errs m b
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) b) -> RescueT errs m b)
-> m (Either (OpenUnion errs) b) -> RescueT errs m b
forall a b. (a -> b) -> a -> b
$ m (Either (OpenUnion errs) a)
action m (Either (OpenUnion errs) a)
-> (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) b))
-> m (Either (OpenUnion errs) b)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Left  OpenUnion errs
err -> Either (OpenUnion errs) b -> m (Either (OpenUnion errs) b)
forall (m :: * -> *) a. Monad m => a -> m a
return (OpenUnion errs -> Either (OpenUnion errs) b
forall a b. a -> Either a b
Left OpenUnion errs
err)
    Right a
val -> RescueT errs m b -> m (Either (OpenUnion errs) b)
forall (errs :: [*]) (m :: * -> *) a.
RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT (a -> RescueT errs m b
k a
val)

instance MonadTrans (RescueT errs) where
  lift :: m a -> RescueT errs m a
lift m a
action = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (a -> Either (OpenUnion errs) a
forall a b. b -> Either a b
Right (a -> Either (OpenUnion errs) a)
-> m a -> m (Either (OpenUnion errs) a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m a
action)

instance Monad m => MonadTransError RescueT errs m where
  onRaise :: (OpenUnion (Errors (RescueT errs m)) -> RescueT targetErrs m a)
-> RescueT errs m a -> RescueT targetErrs m a
onRaise OpenUnion (Errors (RescueT errs m)) -> RescueT targetErrs m a
f (RescueT m (Either (OpenUnion errs) a)
inner) =
    m (Either (OpenUnion targetErrs) a) -> RescueT targetErrs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion targetErrs) a) -> RescueT targetErrs m a)
-> m (Either (OpenUnion targetErrs) a) -> RescueT targetErrs m a
forall a b. (a -> b) -> a -> b
$
      m (Either (OpenUnion errs) a)
inner m (Either (OpenUnion errs) a)
-> (Either (OpenUnion errs) a
    -> m (Either (OpenUnion targetErrs) a))
-> m (Either (OpenUnion targetErrs) a)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Left  OpenUnion errs
err -> RescueT targetErrs m a -> m (Either (OpenUnion targetErrs) a)
forall (errs :: [*]) (m :: * -> *) a.
RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT (RescueT targetErrs m a -> m (Either (OpenUnion targetErrs) a))
-> RescueT targetErrs m a -> m (Either (OpenUnion targetErrs) a)
forall a b. (a -> b) -> a -> b
$ OpenUnion (Errors (RescueT errs m)) -> RescueT targetErrs m a
f OpenUnion errs
OpenUnion (Errors (RescueT errs m))
err
        Right a
val -> Either (OpenUnion targetErrs) a
-> m (Either (OpenUnion targetErrs) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either (OpenUnion targetErrs) a
 -> m (Either (OpenUnion targetErrs) a))
-> Either (OpenUnion targetErrs) a
-> m (Either (OpenUnion targetErrs) a)
forall a b. (a -> b) -> a -> b
$ a -> Either (OpenUnion targetErrs) a
forall a b. b -> Either a b
Right a
val

instance MonadBase b m => MonadBase b (RescueT errs m) where
  liftBase :: b α -> RescueT errs m α
liftBase = b α -> RescueT errs m α
forall (t :: (* -> *) -> * -> *) (b :: * -> *) (m :: * -> *) α.
(MonadTrans t, MonadBase b m) =>
b α -> t m α
liftBaseDefault

instance MonadIO m => MonadIO (RescueT errs m) where
  liftIO :: IO a -> RescueT errs m a
liftIO IO a
io = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) a) -> RescueT errs m a)
-> m (Either (OpenUnion errs) a) -> RescueT errs m a
forall a b. (a -> b) -> a -> b
$ do
    a
action <- IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO a
io
    return (a -> Either (OpenUnion errs) a
forall a b. b -> Either a b
Right a
action)

instance MonadFix m => MonadFix (RescueT errs m) where
  mfix :: (a -> RescueT errs m a) -> RescueT errs m a
mfix a -> RescueT errs m a
f = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) a) -> RescueT errs m a)
-> ((Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
    -> m (Either (OpenUnion errs) a))
-> (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
-> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
-> m (Either (OpenUnion errs) a)
forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix ((Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
 -> RescueT errs m a)
-> (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
-> RescueT errs m a
forall a b. (a -> b) -> a -> b
$ \Either (OpenUnion errs) a
a ->
    RescueT errs m a -> m (Either (OpenUnion errs) a)
forall (errs :: [*]) (m :: * -> *) a.
RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT (RescueT errs m a -> m (Either (OpenUnion errs) a))
-> (a -> RescueT errs m a) -> a -> m (Either (OpenUnion errs) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> RescueT errs m a
f (a -> m (Either (OpenUnion errs) a))
-> a -> m (Either (OpenUnion errs) a)
forall a b. (a -> b) -> a -> b
$ case Either (OpenUnion errs) a
a of
       Right a
r -> a
r
       Either (OpenUnion errs) a
_       -> String -> a
forall a. HasCallStack => String -> a
error String
"Empty mfix argument" -- absurd

instance Foldable m => Foldable (RescueT errs m) where
  foldMap :: (a -> m) -> RescueT errs m a -> m
foldMap a -> m
f (RescueT m (Either (OpenUnion errs) a)
m) = (Either (OpenUnion errs) a -> m)
-> m (Either (OpenUnion errs) a) -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ((a -> m) -> Either (OpenUnion errs) a -> m
forall p t a. Monoid p => (t -> p) -> Either a t -> p
foldMapEither a -> m
f) m (Either (OpenUnion errs) a)
m where
    foldMapEither :: (t -> p) -> Either a t -> p
foldMapEither t -> p
g (Right t
a) = t -> p
g t
a
    foldMapEither t -> p
_ (Left a
_)  = p
forall a. Monoid a => a
mempty

instance (Monad m, Traversable m) => Traversable (RescueT errs m) where
  traverse :: (a -> f b) -> RescueT errs m a -> f (RescueT errs m b)
traverse a -> f b
f (RescueT m (Either (OpenUnion errs) a)
m) = m (Either (OpenUnion errs) b) -> RescueT errs m b
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) b) -> RescueT errs m b)
-> f (m (Either (OpenUnion errs) b)) -> f (RescueT errs m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Either (OpenUnion errs) a -> f (Either (OpenUnion errs) b))
-> m (Either (OpenUnion errs) a)
-> f (m (Either (OpenUnion errs) b))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((a -> f b)
-> Either (OpenUnion errs) a -> f (Either (OpenUnion errs) b)
forall (f :: * -> *) t b a.
Applicative f =>
(t -> f b) -> Either a t -> f (Either a b)
traverseEither a -> f b
f) m (Either (OpenUnion errs) a)
m
    where
      traverseEither :: (t -> f b) -> Either a t -> f (Either a b)
traverseEither t -> f b
g (Right t
val) = b -> Either a b
forall a b. b -> Either a b
Right (b -> Either a b) -> f b -> f (Either a b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> t -> f b
g t
val
      traverseEither t -> f b
_ (Left  a
err) = Either a b -> f (Either a b)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Either a b
forall a b. a -> Either a b
Left a
err)

instance Monad m => MonadRaise (RescueT errs m) where
  type Errors (RescueT errs m) = errs
  raise :: err -> RescueT errs m a
raise err
err = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) a) -> RescueT errs m a)
-> (Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a))
-> Either (OpenUnion errs) a
-> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (OpenUnion errs) a -> m (Either (OpenUnion errs) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either (OpenUnion errs) a -> RescueT errs m a)
-> Either (OpenUnion errs) a -> RescueT errs m a
forall a b. (a -> b) -> a -> b
$ err -> Either (OpenUnion errs) a
forall (m :: * -> *) err a.
(MonadRaise m, Subset err (ErrorCase m)) =>
err -> m a
raise err
err

instance Monad m => MonadRescue (RescueT errs m) where
  attempt :: RescueT errs m a
-> RescueT errs m (Either (ErrorCase (RescueT errs m)) a)
attempt (RescueT m (Either (OpenUnion errs) a)
inner) =
    m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
-> RescueT errs m (Either (OpenUnion errs) a)
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
 -> RescueT errs m (Either (OpenUnion errs) a))
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
-> RescueT errs m (Either (OpenUnion errs) a)
forall a b. (a -> b) -> a -> b
$
      m (Either (OpenUnion errs) a)
inner m (Either (OpenUnion errs) a)
-> (Either (OpenUnion errs) a
    -> m (Either (OpenUnion errs) (Either (OpenUnion errs) a)))
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        Left OpenUnion errs
err  -> Either (OpenUnion errs) (Either (OpenUnion errs) a)
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either (OpenUnion errs) (Either (OpenUnion errs) a)
 -> m (Either (OpenUnion errs) (Either (OpenUnion errs) a)))
-> (Either (OpenUnion errs) a
    -> Either (OpenUnion errs) (Either (OpenUnion errs) a))
-> Either (OpenUnion errs) a
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (OpenUnion errs) a
-> Either (OpenUnion errs) (Either (OpenUnion errs) a)
forall a b. b -> Either a b
Right (Either (OpenUnion errs) a
 -> m (Either (OpenUnion errs) (Either (OpenUnion errs) a)))
-> Either (OpenUnion errs) a
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall a b. (a -> b) -> a -> b
$ OpenUnion errs -> Either (OpenUnion errs) a
forall a b. a -> Either a b
Left OpenUnion errs
err
        Right a
val -> Either (OpenUnion errs) (Either (OpenUnion errs) a)
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either (OpenUnion errs) (Either (OpenUnion errs) a)
 -> m (Either (OpenUnion errs) (Either (OpenUnion errs) a)))
-> (Either (OpenUnion errs) a
    -> Either (OpenUnion errs) (Either (OpenUnion errs) a))
-> Either (OpenUnion errs) a
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either (OpenUnion errs) a
-> Either (OpenUnion errs) (Either (OpenUnion errs) a)
forall a b. b -> Either a b
Right (Either (OpenUnion errs) a
 -> m (Either (OpenUnion errs) (Either (OpenUnion errs) a)))
-> Either (OpenUnion errs) a
-> m (Either (OpenUnion errs) (Either (OpenUnion errs) a))
forall a b. (a -> b) -> a -> b
$ a -> Either (OpenUnion errs) a
forall a b. b -> Either a b
Right a
val

instance MonadThrow m => MonadThrow (RescueT errs m) where
  throwM :: e -> RescueT errs m a
throwM = m a -> RescueT errs m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> RescueT errs m a) -> (e -> m a) -> e -> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> m a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM

instance MonadCatch m => MonadCatch (RescueT errs m) where
  catch :: RescueT errs m a -> (e -> RescueT errs m a) -> RescueT errs m a
catch (RescueT m (Either (OpenUnion errs) a)
m) e -> RescueT errs m a
f = m (Either (OpenUnion errs) a) -> RescueT errs m a
forall (errs :: [*]) (m :: * -> *) a.
m (Either (OpenUnion errs) a) -> RescueT errs m a
RescueT (m (Either (OpenUnion errs) a) -> RescueT errs m a)
-> m (Either (OpenUnion errs) a) -> RescueT errs m a
forall a b. (a -> b) -> a -> b
$ m (Either (OpenUnion errs) a)
-> (e -> m (Either (OpenUnion errs) a))
-> m (Either (OpenUnion errs) a)
forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> (e -> m a) -> m a
catch m (Either (OpenUnion errs) a)
m (RescueT errs m a -> m (Either (OpenUnion errs) a)
forall (errs :: [*]) (m :: * -> *) a.
RescueT errs m a -> m (Either (OpenUnion errs) a)
runRescueT (RescueT errs m a -> m (Either (OpenUnion errs) a))
-> (e -> RescueT errs m a) -> e -> m (Either (OpenUnion errs) a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> RescueT errs m a
f)

instance MonadReader cfg m => MonadReader cfg (RescueT errs m) where
  ask :: RescueT errs m cfg
ask    = m cfg -> RescueT errs m cfg
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift m cfg
forall r (m :: * -> *). MonadReader r m => m r
ask
  local :: (cfg -> cfg) -> RescueT errs m a -> RescueT errs m a
local  = (m (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs) a))
-> RescueT errs m a -> RescueT errs m a
forall (n :: * -> *) (errs :: [*]) a (m :: * -> *) (errs' :: [*])
       b.
(n (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs') b))
-> RescueT errs n a -> RescueT errs' m b
mapRescueT ((m (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs) a))
 -> RescueT errs m a -> RescueT errs m a)
-> ((cfg -> cfg)
    -> m (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs) a))
-> (cfg -> cfg)
-> RescueT errs m a
-> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (cfg -> cfg)
-> m (Either (OpenUnion errs) a) -> m (Either (OpenUnion errs) a)
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local
  reader :: (cfg -> a) -> RescueT errs m a
reader = m a -> RescueT errs m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m a -> RescueT errs m a)
-> ((cfg -> a) -> m a) -> (cfg -> a) -> RescueT errs m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (cfg -> a) -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
reader