{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}
module Control.Monad.Trans.Compose where
import Control.Monad.Base
import Control.Monad.Except
import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Trans.Control
import Control.Monad.Trans.Elevator
import Control.Monad.Writer
import Data.Kind
type ComposeT :: ((Type -> Type) -> Type -> Type)
-> ((Type -> Type) -> Type -> Type)
-> (Type -> Type)
-> Type
-> Type
newtype ComposeT t1 t2 m a = ComposeT { ComposeT t1 t2 m a -> t1 (t2 m) a
deComposeT :: t1 (t2 m) a }
deriving newtype (Functor (ComposeT t1 t2 m)
a -> ComposeT t1 t2 m a
Functor (ComposeT t1 t2 m)
-> (forall a. a -> ComposeT t1 t2 m a)
-> (forall a b.
ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b)
-> (forall a b c.
(a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m c)
-> (forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b)
-> (forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a)
-> Applicative (ComposeT t1 t2 m)
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
(a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m c
forall a. a -> ComposeT t1 t2 m a
forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
forall a b.
ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
forall a b c.
(a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT 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 (ComposeT t1 t2 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
Applicative (t1 (t2 m)) =>
a -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b c.
Applicative (t1 (t2 m)) =>
(a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m c
<* :: ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
$c<* :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
*> :: ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
$c*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
liftA2 :: (a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m c
$cliftA2 :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b c.
Applicative (t1 (t2 m)) =>
(a -> b -> c)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m c
<*> :: ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
$c<*> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Applicative (t1 (t2 m)) =>
ComposeT t1 t2 m (a -> b)
-> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
pure :: a -> ComposeT t1 t2 m a
$cpure :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
Applicative (t1 (t2 m)) =>
a -> ComposeT t1 t2 m a
$cp1Applicative :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *).
Applicative (t1 (t2 m)) =>
Functor (ComposeT t1 t2 m)
Applicative, a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
(a -> b) -> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
(forall a b. (a -> b) -> ComposeT t1 t2 m a -> ComposeT t1 t2 m b)
-> (forall a b. a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a)
-> Functor (ComposeT t1 t2 m)
forall a b. a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
forall a b. (a -> b) -> ComposeT t1 t2 m a -> ComposeT 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 -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Functor (t1 (t2 m)) =>
(a -> b) -> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
<$ :: a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
$c<$ :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Functor (t1 (t2 m)) =>
a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m a
fmap :: (a -> b) -> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
$cfmap :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Functor (t1 (t2 m)) =>
(a -> b) -> ComposeT t1 t2 m a -> ComposeT t1 t2 m b
Functor, Applicative (ComposeT t1 t2 m)
a -> ComposeT t1 t2 m a
Applicative (ComposeT t1 t2 m)
-> (forall a b.
ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT t1 t2 m b)
-> (forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b)
-> (forall a. a -> ComposeT t1 t2 m a)
-> Monad (ComposeT t1 t2 m)
ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT t1 t2 m b
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
forall a. a -> ComposeT t1 t2 m a
forall a b.
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
forall a b.
ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT 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 (ComposeT t1 t2 m)
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
Monad (t1 (t2 m)) =>
a -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Monad (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Monad (t1 (t2 m)) =>
ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT t1 t2 m b
return :: a -> ComposeT t1 t2 m a
$creturn :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
Monad (t1 (t2 m)) =>
a -> ComposeT t1 t2 m a
>> :: ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
$c>> :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Monad (t1 (t2 m)) =>
ComposeT t1 t2 m a -> ComposeT t1 t2 m b -> ComposeT t1 t2 m b
>>= :: ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT t1 t2 m b
$c>>= :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a b.
Monad (t1 (t2 m)) =>
ComposeT t1 t2 m a
-> (a -> ComposeT t1 t2 m b) -> ComposeT t1 t2 m b
$cp1Monad :: forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *).
Monad (t1 (t2 m)) =>
Applicative (ComposeT t1 t2 m)
Monad)
instance (forall m. Monad m => Monad (t2 m), MonadTrans t1, MonadTrans t2) => MonadTrans (ComposeT t1 t2) where
lift :: m a -> ComposeT t1 t2 m a
lift = t1 (t2 m) a -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
t1 (t2 m) a -> ComposeT t1 t2 m a
ComposeT (t1 (t2 m) a -> ComposeT t1 t2 m a)
-> (m a -> t1 (t2 m) a) -> m a -> ComposeT 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 (ComposeT t1 t2) where
type StT (ComposeT t1 t2) a = StT t2 (StT t1 a)
liftWith :: (Run (ComposeT t1 t2) -> m a) -> ComposeT t1 t2 m a
liftWith Run (ComposeT t1 t2) -> m a
f = (forall b. t1 (t2 m) b -> ComposeT t1 t2 m b)
-> (forall (o :: * -> *) b. ComposeT t1 t2 o b -> t1 (t2 o) b)
-> (RunDefault2 (ComposeT t1 t2) t1 t2 -> m a)
-> ComposeT 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 -> ComposeT t1 t2 m b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
t1 (t2 m) a -> ComposeT t1 t2 m a
ComposeT forall (o :: * -> *) b. ComposeT t1 t2 o b -> t1 (t2 o) b
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
ComposeT t1 t2 m a -> t1 (t2 m) a
deComposeT ((RunDefault2 (ComposeT t1 t2) t1 t2 -> m a) -> ComposeT t1 t2 m a)
-> (RunDefault2 (ComposeT t1 t2) t1 t2 -> m a)
-> ComposeT t1 t2 m a
forall a b. (a -> b) -> a -> b
$ \ RunDefault2 (ComposeT t1 t2) t1 t2
x -> Run (ComposeT t1 t2) -> m a
f RunDefault2 (ComposeT t1 t2) t1 t2
Run (ComposeT t1 t2)
x
restoreT :: m (StT (ComposeT t1 t2) a) -> ComposeT t1 t2 m a
restoreT = (t1 (t2 m) a -> ComposeT t1 t2 m a)
-> m (StT t2 (StT t1 a)) -> ComposeT 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 -> ComposeT t1 t2 m a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
t1 (t2 m) a -> ComposeT t1 t2 m a
ComposeT
deriving via Elevator (ComposeT t1 t2) m
instance
( Monad (t1 (t2 m))
, MonadTrans (ComposeT t1 t2)
, MonadIO m
) => MonadIO (ComposeT t1 t2 m)
deriving via Elevator (ComposeT t1 t2) m
instance
( Monad (t1 (t2 m))
, MonadTrans (ComposeT t1 t2)
, MonadBase b m
) => MonadBase b (ComposeT t1 t2 m)
deriving via Elevator (ComposeT t1 t2) m
instance
( Monad (t1 (t2 m))
, MonadTransControl (ComposeT t1 t2)
, MonadBaseControl b m
) => MonadBaseControl b (ComposeT t1 t2 m)
deriving via Elevator t1 (t2 (m :: * -> *))
instance {-# OVERLAPPABLE #-}
( Monad (t1 (t2 m))
, MonadTransControl t1
, MonadError e (t2 m)
) => MonadError e (ComposeT t1 t2 m)
deriving via ExceptT e (t2 (m :: * -> *))
instance
( Monad (t2 m)
) => MonadError e ((ComposeT (ExceptT e) t2) m)
deriving via Elevator t1 (t2 (m :: * -> *))
instance {-# OVERLAPPABLE #-}
( Monad (t1 (t2 m))
, MonadTransControl t1
, MonadReader r (t2 m)
) => MonadReader r (ComposeT t1 t2 m)
deriving via ReaderT r (t2 (m :: * -> *))
instance
( Monad (t2 m)
) => MonadReader r ((ComposeT (ReaderT r) t2) m)
deriving via Elevator t1 (t2 (m :: * -> *))
instance {-# OVERLAPPABLE #-}
( Monad (t1 (t2 m))
, MonadTrans t1
, MonadState s (t2 m)
) => MonadState s (ComposeT t1 t2 m)
deriving via StateT s (t2 (m :: * -> *))
instance
( Monad (t2 m)
) => MonadState s ((ComposeT (StateT s) t2) m)
deriving via Elevator t1 (t2 (m :: * -> *))
instance {-# OVERLAPPABLE #-}
( Monad (t1 (t2 m))
, MonadTransControl t1
, MonadWriter w (t2 m)
) => MonadWriter w (ComposeT t1 t2 m)
deriving via WriterT w (t2 (m :: * -> *))
instance
( Monad (t2 m)
, Monoid w
) => MonadWriter w ((ComposeT (WriterT w) t2) m)
runComposeT :: (forall a. t1 (t2 m) a -> t2 m (StT t1 a))
-> (forall a. t2 m a -> m (StT t2 a))
-> (forall a. ComposeT t1 t2 m a -> m (StT t2 (StT t1 a)))
runComposeT :: (forall a. t1 (t2 m) a -> t2 m (StT t1 a))
-> (forall a. t2 m a -> m (StT t2 a))
-> forall a. ComposeT t1 t2 m a -> m (StT t2 (StT t1 a))
runComposeT forall a. t1 (t2 m) a -> t2 m (StT t1 a)
runT1 forall a. t2 m a -> m (StT t2 a)
runT2 = t2 m (StT t1 a) -> m (StT t2 (StT t1 a))
forall a. t2 m a -> m (StT t2 a)
runT2 (t2 m (StT t1 a) -> m (StT t2 (StT t1 a)))
-> (ComposeT t1 t2 m a -> t2 m (StT t1 a))
-> ComposeT t1 t2 m a
-> m (StT t2 (StT t1 a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t1 (t2 m) a -> t2 m (StT t1 a)
forall a. t1 (t2 m) a -> t2 m (StT t1 a)
runT1 (t1 (t2 m) a -> t2 m (StT t1 a))
-> (ComposeT t1 t2 m a -> t1 (t2 m) a)
-> ComposeT t1 t2 m a
-> t2 m (StT t1 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ComposeT t1 t2 m a -> t1 (t2 m) a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
ComposeT t1 t2 m a -> t1 (t2 m) a
deComposeT
runComposeT' :: (t1 (t2 m) a -> t2 m a)
-> (t2 m a -> m a)
-> (ComposeT t1 t2 m a -> m a)
runComposeT' :: (t1 (t2 m) a -> t2 m a)
-> (t2 m a -> m a) -> ComposeT t1 t2 m a -> m a
runComposeT' t1 (t2 m) a -> t2 m a
runT1 t2 m a -> m a
runT2 = t2 m a -> m a
runT2 (t2 m a -> m a)
-> (ComposeT t1 t2 m a -> t2 m a) -> ComposeT t1 t2 m a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t1 (t2 m) a -> t2 m a
runT1 (t1 (t2 m) a -> t2 m a)
-> (ComposeT t1 t2 m a -> t1 (t2 m) a)
-> ComposeT t1 t2 m a
-> t2 m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ComposeT t1 t2 m a -> t1 (t2 m) a
forall (t1 :: (* -> *) -> * -> *) (t2 :: (* -> *) -> * -> *)
(m :: * -> *) a.
ComposeT t1 t2 m a -> t1 (t2 m) a
deComposeT