{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}

module Control.Monad.Trans.Deriving (
  Stack0T (..)
, Stack1T (..)
, Stack2T (..)
, Stack3T (..)
) where

import Control.Monad.Base
import Control.Monad.Trans
import Control.Monad.Trans.Control
import Data.Kind

newtype Stack0T
  (m :: Type -> Type)
  (a :: Type)
    = Stack0T { Stack0T m a -> m a
unStack0T :: m a }
  deriving (Functor (Stack0T m)
a -> Stack0T m a
Functor (Stack0T m)
-> (forall a. a -> Stack0T m a)
-> (forall a b. Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b)
-> (forall a b c.
    (a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c)
-> (forall a b. Stack0T m a -> Stack0T m b -> Stack0T m b)
-> (forall a b. Stack0T m a -> Stack0T m b -> Stack0T m a)
-> Applicative (Stack0T m)
Stack0T m a -> Stack0T m b -> Stack0T m b
Stack0T m a -> Stack0T m b -> Stack0T m a
Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b
(a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c
forall a. a -> Stack0T m a
forall a b. Stack0T m a -> Stack0T m b -> Stack0T m a
forall a b. Stack0T m a -> Stack0T m b -> Stack0T m b
forall a b. Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b
forall a b c.
(a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (m :: * -> *). Applicative m => Functor (Stack0T m)
forall (m :: * -> *) a. Applicative m => a -> Stack0T m a
forall (m :: * -> *) a b.
Applicative m =>
Stack0T m a -> Stack0T m b -> Stack0T m a
forall (m :: * -> *) a b.
Applicative m =>
Stack0T m a -> Stack0T m b -> Stack0T m b
forall (m :: * -> *) a b.
Applicative m =>
Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c
<* :: Stack0T m a -> Stack0T m b -> Stack0T m a
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
Stack0T m a -> Stack0T m b -> Stack0T m a
*> :: Stack0T m a -> Stack0T m b -> Stack0T m b
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
Stack0T m a -> Stack0T m b -> Stack0T m b
liftA2 :: (a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> Stack0T m a -> Stack0T m b -> Stack0T m c
<*> :: Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
Stack0T m (a -> b) -> Stack0T m a -> Stack0T m b
pure :: a -> Stack0T m a
$cpure :: forall (m :: * -> *) a. Applicative m => a -> Stack0T m a
$cp1Applicative :: forall (m :: * -> *). Applicative m => Functor (Stack0T m)
Applicative, a -> Stack0T m b -> Stack0T m a
(a -> b) -> Stack0T m a -> Stack0T m b
(forall a b. (a -> b) -> Stack0T m a -> Stack0T m b)
-> (forall a b. a -> Stack0T m b -> Stack0T m a)
-> Functor (Stack0T m)
forall a b. a -> Stack0T m b -> Stack0T m a
forall a b. (a -> b) -> Stack0T m a -> Stack0T m b
forall (m :: * -> *) a b.
Functor m =>
a -> Stack0T m b -> Stack0T m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Stack0T m a -> Stack0T m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Stack0T m b -> Stack0T m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> Stack0T m b -> Stack0T m a
fmap :: (a -> b) -> Stack0T m a -> Stack0T m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Stack0T m a -> Stack0T m b
Functor, Applicative (Stack0T m)
a -> Stack0T m a
Applicative (Stack0T m)
-> (forall a b. Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b)
-> (forall a b. Stack0T m a -> Stack0T m b -> Stack0T m b)
-> (forall a. a -> Stack0T m a)
-> Monad (Stack0T m)
Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b
Stack0T m a -> Stack0T m b -> Stack0T m b
forall a. a -> Stack0T m a
forall a b. Stack0T m a -> Stack0T m b -> Stack0T m b
forall a b. Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b
forall (m :: * -> *). Monad m => Applicative (Stack0T m)
forall (m :: * -> *) a. Monad m => a -> Stack0T m a
forall (m :: * -> *) a b.
Monad m =>
Stack0T m a -> Stack0T m b -> Stack0T m b
forall (m :: * -> *) a b.
Monad m =>
Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Stack0T m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> Stack0T m a
>> :: Stack0T m a -> Stack0T m b -> Stack0T m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
Stack0T m a -> Stack0T m b -> Stack0T m b
>>= :: Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
Stack0T m a -> (a -> Stack0T m b) -> Stack0T m b
$cp1Monad :: forall (m :: * -> *). Monad m => Applicative (Stack0T m)
Monad, MonadBase b, MonadBaseControl b)

instance MonadTrans Stack0T where
  lift :: m a -> Stack0T m a
lift = m a -> Stack0T m a
forall (m :: * -> *) a. m a -> Stack0T m a
Stack0T

instance MonadTransControl Stack0T where
  type StT Stack0T a = a
  liftWith :: (Run Stack0T -> m a) -> Stack0T m a
liftWith Run Stack0T -> m a
f = m a -> Stack0T m a
forall (m :: * -> *) a. m a -> Stack0T m a
Stack0T (m a -> Stack0T m a) -> m a -> Stack0T m a
forall a b. (a -> b) -> a -> b
$ Run Stack0T -> m a
f Run Stack0T
forall (m :: * -> *) a. Stack0T m a -> m a
unStack0T
  restoreT :: m (StT Stack0T a) -> Stack0T m a
restoreT = m (StT Stack0T a) -> Stack0T m a
forall (m :: * -> *) a. m a -> Stack0T m a
Stack0T

newtype Stack1T
  (t :: (Type -> Type) -> Type -> Type)
  (m :: Type -> Type)
  (a :: Type)
    = Stack1T { Stack1T t m a -> t m a
unStack1T :: t m a }
  deriving (Functor (Stack1T t m)
a -> Stack1T t m a
Functor (Stack1T t m)
-> (forall a. a -> Stack1T t m a)
-> (forall a b.
    Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b)
-> (forall a b c.
    (a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c)
-> (forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m b)
-> (forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m a)
-> Applicative (Stack1T t m)
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
Stack1T t m a -> Stack1T t m b -> Stack1T t m a
Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b
(a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c
forall a. a -> Stack1T t m a
forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m a
forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m b
forall a b. Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b
forall a b c.
(a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
Applicative (t m) =>
Functor (Stack1T t m)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (t m) =>
a -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (t m) =>
(a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c
<* :: Stack1T t m a -> Stack1T t m b -> Stack1T t m a
$c<* :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m a
*> :: Stack1T t m a -> Stack1T t m b -> Stack1T t m b
$c*> :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
liftA2 :: (a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c
$cliftA2 :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (t m) =>
(a -> b -> c) -> Stack1T t m a -> Stack1T t m b -> Stack1T t m c
<*> :: Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b
$c<*> :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t m) =>
Stack1T t m (a -> b) -> Stack1T t m a -> Stack1T t m b
pure :: a -> Stack1T t m a
$cpure :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (t m) =>
a -> Stack1T t m a
$cp1Applicative :: forall (t :: (* -> *) -> * -> *) (m :: * -> *).
Applicative (t m) =>
Functor (Stack1T t m)
Applicative, a -> Stack1T t m b -> Stack1T t m a
(a -> b) -> Stack1T t m a -> Stack1T t m b
(forall a b. (a -> b) -> Stack1T t m a -> Stack1T t m b)
-> (forall a b. a -> Stack1T t m b -> Stack1T t m a)
-> Functor (Stack1T t m)
forall a b. a -> Stack1T t m b -> Stack1T t m a
forall a b. (a -> b) -> Stack1T t m a -> Stack1T t m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t m) =>
a -> Stack1T t m b -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t m) =>
(a -> b) -> Stack1T t m a -> Stack1T t m b
<$ :: a -> Stack1T t m b -> Stack1T t m a
$c<$ :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t m) =>
a -> Stack1T t m b -> Stack1T t m a
fmap :: (a -> b) -> Stack1T t m a -> Stack1T t m b
$cfmap :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t m) =>
(a -> b) -> Stack1T t m a -> Stack1T t m b
Functor, Applicative (Stack1T t m)
a -> Stack1T t m a
Applicative (Stack1T t m)
-> (forall a b.
    Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b)
-> (forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m b)
-> (forall a. a -> Stack1T t m a)
-> Monad (Stack1T t m)
Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
forall a. a -> Stack1T t m a
forall a b. Stack1T t m a -> Stack1T t m b -> Stack1T t m b
forall a b. Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
forall (t :: (* -> *) -> * -> *) (m :: * -> *).
Monad (t m) =>
Applicative (Stack1T t m)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (t m) =>
a -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t m) =>
Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b
return :: a -> Stack1T t m a
$creturn :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (t m) =>
a -> Stack1T t m a
>> :: Stack1T t m a -> Stack1T t m b -> Stack1T t m b
$c>> :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t m) =>
Stack1T t m a -> Stack1T t m b -> Stack1T t m b
>>= :: Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b
$c>>= :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t m) =>
Stack1T t m a -> (a -> Stack1T t m b) -> Stack1T t m b
$cp1Monad :: forall (t :: (* -> *) -> * -> *) (m :: * -> *).
Monad (t m) =>
Applicative (Stack1T t m)
Monad, MonadBase b, MonadBaseControl b, m a -> Stack1T t m a
(forall (m :: * -> *) a. Monad m => m a -> Stack1T t m a)
-> MonadTrans (Stack1T t)
forall (m :: * -> *) a. Monad m => m a -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> Stack1T t m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> Stack1T t m a
$clift :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> Stack1T t m a
MonadTrans, MonadTrans (Stack1T t)
m (StT (Stack1T t) a) -> Stack1T t m a
MonadTrans (Stack1T t)
-> (forall (m :: * -> *) a.
    Monad m =>
    (Run (Stack1T t) -> m a) -> Stack1T t m a)
-> (forall (m :: * -> *) a.
    Monad m =>
    m (StT (Stack1T t) a) -> Stack1T t m a)
-> MonadTransControl (Stack1T t)
(Run (Stack1T t) -> m a) -> Stack1T t m a
forall (m :: * -> *) a.
Monad m =>
m (StT (Stack1T t) a) -> Stack1T t m a
forall (m :: * -> *) a.
Monad m =>
(Run (Stack1T t) -> m a) -> Stack1T t m a
forall (t :: (* -> *) -> * -> *).
MonadTrans t
-> (forall (m :: * -> *) a. Monad m => (Run t -> m a) -> t m a)
-> (forall (m :: * -> *) a. Monad m => m (StT t a) -> t m a)
-> MonadTransControl t
forall (t :: (* -> *) -> * -> *).
MonadTransControl t =>
MonadTrans (Stack1T t)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
m (StT (Stack1T t) a) -> Stack1T t m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run (Stack1T t) -> m a) -> Stack1T t m a
restoreT :: m (StT (Stack1T t) a) -> Stack1T t m a
$crestoreT :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
m (StT (Stack1T t) a) -> Stack1T t m a
liftWith :: (Run (Stack1T t) -> m a) -> Stack1T t m a
$cliftWith :: forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run (Stack1T t) -> m a) -> Stack1T t m a
$cp1MonadTransControl :: forall (t :: (* -> *) -> * -> *).
MonadTransControl t =>
MonadTrans (Stack1T t)
MonadTransControl)

newtype Stack2T
  (t1 :: (Type -> Type) -> Type -> Type)
  (t2 :: (Type -> Type) -> Type -> Type)
  (m :: Type -> Type)
  (a :: Type)
    = Stack2T { Stack2T t1 t2 m a -> t1 (t2 m) a
unStack2T :: t1 (t2 m) a }
  deriving (Functor (Stack2T t1 t2 m)
a -> Stack2T t1 t2 m a
Functor (Stack2T t1 t2 m)
-> (forall a. a -> Stack2T t1 t2 m a)
-> (forall a b.
    Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b)
-> (forall a b c.
    (a -> b -> c)
    -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c)
-> (forall a b.
    Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b)
-> (forall a b.
    Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a)
-> Applicative (Stack2T t1 t2 m)
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
(a -> b -> c)
-> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c
forall a. a -> Stack2T t1 t2 m a
forall a b.
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
forall a b.
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
forall a b.
Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
forall a b c.
(a -> b -> c)
-> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *).
Applicative (t1 (t2 m)) =>
Functor (Stack2T t1 t2 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
Applicative (t1 (t2 m)) =>
a -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b c.
Applicative (t1 (t2 m)) =>
(a -> b -> c)
-> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c
<* :: Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
$c<* :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
*> :: Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
$c*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
liftA2 :: (a -> b -> c)
-> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c
$cliftA2 :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b c.
Applicative (t1 (t2 m)) =>
(a -> b -> c)
-> Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m c
<*> :: Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
$c<*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
Stack2T t1 t2 m (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
pure :: a -> Stack2T t1 t2 m a
$cpure :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
Applicative (t1 (t2 m)) =>
a -> Stack2T t1 t2 m a
$cp1Applicative :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *).
Applicative (t1 (t2 m)) =>
Functor (Stack2T t1 t2 m)
Applicative, a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
(a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
(forall a b. (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b)
-> (forall a b. a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a)
-> Functor (Stack2T t1 t2 m)
forall a b. a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
forall a b. (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Functor (t1 (t2 m)) =>
a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Functor (t1 (t2 m)) =>
(a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
<$ :: a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
$c<$ :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Functor (t1 (t2 m)) =>
a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m a
fmap :: (a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
$cfmap :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Functor (t1 (t2 m)) =>
(a -> b) -> Stack2T t1 t2 m a -> Stack2T t1 t2 m b
Functor, Applicative (Stack2T t1 t2 m)
a -> Stack2T t1 t2 m a
Applicative (Stack2T t1 t2 m)
-> (forall a b.
    Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b)
-> (forall a b.
    Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b)
-> (forall a. a -> Stack2T t1 t2 m a)
-> Monad (Stack2T t1 t2 m)
Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
forall a. a -> Stack2T t1 t2 m a
forall a b.
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
forall a b.
Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *).
Monad (t1 (t2 m)) =>
Applicative (Stack2T t1 t2 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
Monad (t1 (t2 m)) =>
a -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Monad (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Monad (t1 (t2 m)) =>
Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b
return :: a -> Stack2T t1 t2 m a
$creturn :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
Monad (t1 (t2 m)) =>
a -> Stack2T t1 t2 m a
>> :: Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
$c>> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Monad (t1 (t2 m)) =>
Stack2T t1 t2 m a -> Stack2T t1 t2 m b -> Stack2T t1 t2 m b
>>= :: Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b
$c>>= :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a b.
Monad (t1 (t2 m)) =>
Stack2T t1 t2 m a -> (a -> Stack2T t1 t2 m b) -> Stack2T t1 t2 m b
$cp1Monad :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *).
Monad (t1 (t2 m)) =>
Applicative (Stack2T t1 t2 m)
Monad, MonadBase b, MonadBaseControl b)

instance (forall m. Monad m => Monad (t2 m), MonadTrans t1, MonadTrans t2) => MonadTrans (Stack2T t1 t2) where
  lift :: m a -> Stack2T t1 t2 m a
lift = t1 (t2 m) a -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
t1 (t2 m) a -> Stack2T t1 t2 m a
Stack2T (t1 (t2 m) a -> Stack2T t1 t2 m a)
-> (m a -> t1 (t2 m) a) -> m a -> Stack2T t1 t2 m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t2 m a -> t1 (t2 m) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (t2 m a -> t1 (t2 m) a) -> (m a -> t2 m a) -> m a -> t1 (t2 m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> t2 m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance (forall m. Monad m => Monad (t2 m), MonadTransControl t1, MonadTransControl t2) => MonadTransControl (Stack2T t1 t2) where
  type StT (Stack2T t1 t2) a = StT t2 (StT t1 a)
  liftWith :: (Run (Stack2T t1 t2) -> m a) -> Stack2T t1 t2 m a
liftWith Run (Stack2T t1 t2) -> m a
f = (forall b. t1 (t2 m) b -> Stack2T t1 t2 m b)
-> (forall (o :: * -> *) b. Stack2T t1 t2 o b -> t1 (t2 o) b)
-> (RunDefault2 (Stack2T t1 t2) t1 t2 -> m a)
-> Stack2T t1 t2 m a
forall (m :: * -> *) (n' :: (* -> *) -> * -> *)
       (n :: (* -> *) -> * -> *) (t :: (* -> *) -> * -> *) a.
(Monad m, Monad (n' m), MonadTransControl n,
 MonadTransControl n') =>
(forall b. n (n' m) b -> t m b)
-> (forall (o :: * -> *) b. t o b -> n (n' o) b)
-> (RunDefault2 t n n' -> m a)
-> t m a
defaultLiftWith2 forall b. t1 (t2 m) b -> Stack2T t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
t1 (t2 m) a -> Stack2T t1 t2 m a
Stack2T forall (o :: * -> *) b. Stack2T t1 t2 o b -> t1 (t2 o) b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
Stack2T t1 t2 m a -> t1 (t2 m) a
unStack2T ((RunDefault2 (Stack2T t1 t2) t1 t2 -> m a) -> Stack2T t1 t2 m a)
-> (RunDefault2 (Stack2T t1 t2) t1 t2 -> m a) -> Stack2T t1 t2 m a
forall a b. (a -> b) -> a -> b
$ \RunDefault2 (Stack2T t1 t2) t1 t2
x -> Run (Stack2T t1 t2) -> m a
f RunDefault2 (Stack2T t1 t2) t1 t2
Run (Stack2T t1 t2)
x
  restoreT :: m (StT (Stack2T t1 t2) a) -> Stack2T t1 t2 m a
restoreT = (t1 (t2 m) a -> Stack2T t1 t2 m a)
-> m (StT t2 (StT t1 a)) -> Stack2T t1 t2 m a
forall (m :: * -> *) (n' :: (* -> *) -> * -> *)
       (n :: (* -> *) -> * -> *) a (t :: (* -> *) -> * -> *).
(Monad m, Monad (n' m), MonadTransControl n,
 MonadTransControl n') =>
(n (n' m) a -> t m a) -> m (StT n' (StT n a)) -> t m a
defaultRestoreT2 t1 (t2 m) a -> Stack2T t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (m :: * -> *) a.
t1 (t2 m) a -> Stack2T t1 t2 m a
Stack2T

newtype Stack3T
  (t1 :: (Type -> Type) -> Type -> Type)
  (t2 :: (Type -> Type) -> Type -> Type)
  (t3 :: (Type -> Type) -> Type -> Type)
  (m :: Type -> Type)
  (a :: Type)
    = Stack3T { Stack3T t1 t2 t3 m a -> t1 (t2 (t3 m)) a
unStack3T :: t1 (t2 (t3 m)) a }
  deriving (Functor (Stack3T t1 t2 t3 m)
a -> Stack3T t1 t2 t3 m a
Functor (Stack3T t1 t2 t3 m)
-> (forall a. a -> Stack3T t1 t2 t3 m a)
-> (forall a b.
    Stack3T t1 t2 t3 m (a -> b)
    -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b)
-> (forall a b c.
    (a -> b -> c)
    -> Stack3T t1 t2 t3 m a
    -> Stack3T t1 t2 t3 m b
    -> Stack3T t1 t2 t3 m c)
-> (forall a b.
    Stack3T t1 t2 t3 m a
    -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b)
-> (forall a b.
    Stack3T t1 t2 t3 m a
    -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a)
-> Applicative (Stack3T t1 t2 t3 m)
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
Stack3T t1 t2 t3 m (a -> b)
-> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
(a -> b -> c)
-> Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b
-> Stack3T t1 t2 t3 m c
forall a. a -> Stack3T t1 t2 t3 m a
forall a b.
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
forall a b.
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
forall a b.
Stack3T t1 t2 t3 m (a -> b)
-> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
forall a b c.
(a -> b -> c)
-> Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b
-> Stack3T t1 t2 t3 m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *).
Applicative (t1 (t2 (t3 m))) =>
Functor (Stack3T t1 t2 t3 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m (a -> b)
-> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (t1 (t2 (t3 m))) =>
(a -> b -> c)
-> Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b
-> Stack3T t1 t2 t3 m c
<* :: Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
$c<* :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
*> :: Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
$c*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
liftA2 :: (a -> b -> c)
-> Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b
-> Stack3T t1 t2 t3 m c
$cliftA2 :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b c.
Applicative (t1 (t2 (t3 m))) =>
(a -> b -> c)
-> Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b
-> Stack3T t1 t2 t3 m c
<*> :: Stack3T t1 t2 t3 m (a -> b)
-> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
$c<*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Applicative (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m (a -> b)
-> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
pure :: a -> Stack3T t1 t2 t3 m a
$cpure :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
Applicative (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m a
$cp1Applicative :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *).
Applicative (t1 (t2 (t3 m))) =>
Functor (Stack3T t1 t2 t3 m)
Applicative, a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
(a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
(forall a b.
 (a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b)
-> (forall a b. a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a)
-> Functor (Stack3T t1 t2 t3 m)
forall a b. a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
forall a b.
(a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t1 (t2 (t3 m))) =>
(a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
<$ :: a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
$c<$ :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m a
fmap :: (a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
$cfmap :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Functor (t1 (t2 (t3 m))) =>
(a -> b) -> Stack3T t1 t2 t3 m a -> Stack3T t1 t2 t3 m b
Functor, Applicative (Stack3T t1 t2 t3 m)
a -> Stack3T t1 t2 t3 m a
Applicative (Stack3T t1 t2 t3 m)
-> (forall a b.
    Stack3T t1 t2 t3 m a
    -> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b)
-> (forall a b.
    Stack3T t1 t2 t3 m a
    -> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b)
-> (forall a. a -> Stack3T t1 t2 t3 m a)
-> Monad (Stack3T t1 t2 t3 m)
Stack3T t1 t2 t3 m a
-> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
forall a. a -> Stack3T t1 t2 t3 m a
forall a b.
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
forall a b.
Stack3T t1 t2 t3 m a
-> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *).
Monad (t1 (t2 (t3 m))) =>
Applicative (Stack3T t1 t2 t3 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b
return :: a -> Stack3T t1 t2 t3 m a
$creturn :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
Monad (t1 (t2 (t3 m))) =>
a -> Stack3T t1 t2 t3 m a
>> :: Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
$c>> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> Stack3T t1 t2 t3 m b -> Stack3T t1 t2 t3 m b
>>= :: Stack3T t1 t2 t3 m a
-> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b
$c>>= :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a b.
Monad (t1 (t2 (t3 m))) =>
Stack3T t1 t2 t3 m a
-> (a -> Stack3T t1 t2 t3 m b) -> Stack3T t1 t2 t3 m b
$cp1Monad :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *).
Monad (t1 (t2 (t3 m))) =>
Applicative (Stack3T t1 t2 t3 m)
Monad, MonadBase b, MonadBaseControl b)

instance (forall m. Monad m => Monad (t3 m), forall m. Monad m => Monad (t2 (t3 m)), MonadTrans t1, MonadTrans t2, MonadTrans t3) => MonadTrans (Stack3T t1 t2 t3) where
  lift :: m a -> Stack3T t1 t2 t3 m a
lift = t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
Stack3T (t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a)
-> (m a -> t1 (t2 (t3 m)) a) -> m a -> Stack3T t1 t2 t3 m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t2 (t3 m) a -> t1 (t2 (t3 m)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (t2 (t3 m) a -> t1 (t2 (t3 m)) a)
-> (m a -> t2 (t3 m) a) -> m a -> t1 (t2 (t3 m)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t3 m a -> t2 (t3 m) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (t3 m a -> t2 (t3 m) a) -> (m a -> t3 m a) -> m a -> t2 (t3 m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m a -> t3 m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift

instance (forall m. Monad m => Monad (t3 m), forall m. Monad m => Monad (t2 (t3 m)), MonadTransControl t1, MonadTransControl t2, MonadTransControl t3) => MonadTransControl (Stack3T t1 t2 t3) where
  type StT (Stack3T t1 t2 t3) a = StT t3 (StT t2 (StT t1 a))
  liftWith :: (Run (Stack3T t1 t2 t3) -> m a) -> Stack3T t1 t2 t3 m a
liftWith Run (Stack3T t1 t2 t3) -> m a
f = t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
Stack3T (t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a)
-> t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
forall a b. (a -> b) -> a -> b
$ (Run t1 -> t2 (t3 m) a) -> t1 (t2 (t3 m)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run t -> m a) -> t m a
liftWith ((Run t1 -> t2 (t3 m) a) -> t1 (t2 (t3 m)) a)
-> (Run t1 -> t2 (t3 m) a) -> t1 (t2 (t3 m)) a
forall a b. (a -> b) -> a -> b
$ \Run t1
run -> (Run t2 -> t3 m a) -> t2 (t3 m) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run t -> m a) -> t m a
liftWith ((Run t2 -> t3 m a) -> t2 (t3 m) a)
-> (Run t2 -> t3 m a) -> t2 (t3 m) a
forall a b. (a -> b) -> a -> b
$ \Run t2
run' -> (Run t3 -> m a) -> t3 m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
(Run t -> m a) -> t m a
liftWith ((Run t3 -> m a) -> t3 m a) -> (Run t3 -> m a) -> t3 m a
forall a b. (a -> b) -> a -> b
$ \ Run t3
run'' -> Run (Stack3T t1 t2 t3) -> m a
f (Run (Stack3T t1 t2 t3) -> m a) -> Run (Stack3T t1 t2 t3) -> m a
forall a b. (a -> b) -> a -> b
$ t3 n (StT t2 (StT t1 b)) -> n (StT t3 (StT t2 (StT t1 b)))
Run t3
run'' (t3 n (StT t2 (StT t1 b)) -> n (StT t3 (StT t2 (StT t1 b))))
-> (Stack3T t1 t2 t3 n b -> t3 n (StT t2 (StT t1 b)))
-> Stack3T t1 t2 t3 n b
-> n (StT t3 (StT t2 (StT t1 b)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t2 (t3 n) (StT t1 b) -> t3 n (StT t2 (StT t1 b))
Run t2
run' (t2 (t3 n) (StT t1 b) -> t3 n (StT t2 (StT t1 b)))
-> (Stack3T t1 t2 t3 n b -> t2 (t3 n) (StT t1 b))
-> Stack3T t1 t2 t3 n b
-> t3 n (StT t2 (StT t1 b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t1 (t2 (t3 n)) b -> t2 (t3 n) (StT t1 b)
Run t1
run (t1 (t2 (t3 n)) b -> t2 (t3 n) (StT t1 b))
-> (Stack3T t1 t2 t3 n b -> t1 (t2 (t3 n)) b)
-> Stack3T t1 t2 t3 n b
-> t2 (t3 n) (StT t1 b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Stack3T t1 t2 t3 n b -> t1 (t2 (t3 n)) b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
Stack3T t1 t2 t3 m a -> t1 (t2 (t3 m)) a
unStack3T
  restoreT :: m (StT (Stack3T t1 t2 t3) a) -> Stack3T t1 t2 t3 m a
restoreT = t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
       (t3 :: (* -> *) -> * -> *) (m :: * -> *) a.
t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a
Stack3T (t1 (t2 (t3 m)) a -> Stack3T t1 t2 t3 m a)
-> (m (StT t3 (StT t2 (StT t1 a))) -> t1 (t2 (t3 m)) a)
-> m (StT t3 (StT t2 (StT t1 a)))
-> Stack3T t1 t2 t3 m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t2 (t3 m) (StT t1 a) -> t1 (t2 (t3 m)) a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
m (StT t a) -> t m a
restoreT (t2 (t3 m) (StT t1 a) -> t1 (t2 (t3 m)) a)
-> (m (StT t3 (StT t2 (StT t1 a))) -> t2 (t3 m) (StT t1 a))
-> m (StT t3 (StT t2 (StT t1 a)))
-> t1 (t2 (t3 m)) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t3 m (StT t2 (StT t1 a)) -> t2 (t3 m) (StT t1 a)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
m (StT t a) -> t m a
restoreT (t3 m (StT t2 (StT t1 a)) -> t2 (t3 m) (StT t1 a))
-> (m (StT t3 (StT t2 (StT t1 a))) -> t3 m (StT t2 (StT t1 a)))
-> m (StT t3 (StT t2 (StT t1 a)))
-> t2 (t3 m) (StT t1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (StT t3 (StT t2 (StT t1 a))) -> t3 m (StT t2 (StT t1 a))
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTransControl t, Monad m) =>
m (StT t a) -> t m a
restoreT