packages feed

deriving-trans 0.1.0.0 → 0.2.0.0

raw patch · 5 files changed

+194/−105 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Control.Monad.Trans.Deriving: Stack0T :: m a -> Stack0T (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: Stack1T :: t m a -> Stack1T (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: Stack2T :: t1 (t2 m) a -> Stack2T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: Stack3T :: t1 (t2 (t3 m)) a -> Stack3T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (t3 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: [unStack0T] :: Stack0T (m :: Type -> Type) (a :: Type) -> m a
- Control.Monad.Trans.Deriving: [unStack1T] :: Stack1T (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) -> t m a
- Control.Monad.Trans.Deriving: [unStack2T] :: Stack2T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) -> t1 (t2 m) a
- Control.Monad.Trans.Deriving: [unStack3T] :: Stack3T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (t3 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) -> t1 (t2 (t3 m)) a
- Control.Monad.Trans.Deriving: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 m), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2) => Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Deriving.Stack2T t1 t2)
- Control.Monad.Trans.Deriving: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 m), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2) => Control.Monad.Trans.Control.MonadTransControl (Control.Monad.Trans.Deriving.Stack2T t1 t2)
- Control.Monad.Trans.Deriving: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t3 m), forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 (t3 m)), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2, Control.Monad.Trans.Class.MonadTrans t3) => Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3)
- Control.Monad.Trans.Deriving: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t3 m), forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 (t3 m)), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2, Control.Monad.Trans.Control.MonadTransControl t3) => Control.Monad.Trans.Control.MonadTransControl (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3)
- Control.Monad.Trans.Deriving: instance Control.Monad.Base.MonadBase b (t m) => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Deriving.Stack1T t m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Base.MonadBase b (t1 (t2 (t3 m))) => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3 m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Base.MonadBase b (t1 (t2 m)) => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Deriving.Stack2T t1 t2 m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Deriving.Stack0T m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Class.MonadTrans Control.Monad.Trans.Deriving.Stack0T
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Class.MonadTrans t => Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Deriving.Stack1T t)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadBaseControl b (t m) => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Deriving.Stack1T t m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadBaseControl b (t1 (t2 (t3 m))) => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3 m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadBaseControl b (t1 (t2 m)) => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Deriving.Stack2T t1 t2 m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadBaseControl b m => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Deriving.Stack0T m)
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadTransControl Control.Monad.Trans.Deriving.Stack0T
- Control.Monad.Trans.Deriving: instance Control.Monad.Trans.Control.MonadTransControl t => Control.Monad.Trans.Control.MonadTransControl (Control.Monad.Trans.Deriving.Stack1T t)
- Control.Monad.Trans.Deriving: instance GHC.Base.Applicative (t m) => GHC.Base.Applicative (Control.Monad.Trans.Deriving.Stack1T t m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Applicative (t1 (t2 (t3 m))) => GHC.Base.Applicative (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Applicative (t1 (t2 m)) => GHC.Base.Applicative (Control.Monad.Trans.Deriving.Stack2T t1 t2 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Applicative m => GHC.Base.Applicative (Control.Monad.Trans.Deriving.Stack0T m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Functor (t m) => GHC.Base.Functor (Control.Monad.Trans.Deriving.Stack1T t m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Functor (t1 (t2 (t3 m))) => GHC.Base.Functor (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Functor (t1 (t2 m)) => GHC.Base.Functor (Control.Monad.Trans.Deriving.Stack2T t1 t2 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Trans.Deriving.Stack0T m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Monad (t m) => GHC.Base.Monad (Control.Monad.Trans.Deriving.Stack1T t m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Monad (t1 (t2 (t3 m))) => GHC.Base.Monad (Control.Monad.Trans.Deriving.Stack3T t1 t2 t3 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Monad (t1 (t2 m)) => GHC.Base.Monad (Control.Monad.Trans.Deriving.Stack2T t1 t2 m)
- Control.Monad.Trans.Deriving: instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.Trans.Deriving.Stack0T m)
- Control.Monad.Trans.Deriving: newtype Stack0T (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: newtype Stack1T (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: newtype Stack2T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
- Control.Monad.Trans.Deriving: newtype Stack3T (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (t3 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
+ Control.Monad.Trans.Compose: ComposeT :: t1 (t2 m) a -> ComposeT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
+ Control.Monad.Trans.Compose: [deComposeT] :: ComposeT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) -> t1 (t2 m) a
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Compose.ComposeT t1 t2), Control.Monad.Base.MonadBase b m) => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Compose.ComposeT t1 t2), Control.Monad.IO.Class.MonadIO m) => Control.Monad.IO.Class.MonadIO (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.State.Class.MonadState s (t2 m)) => Control.Monad.State.Class.MonadState s (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Control.MonadTransControl (Control.Monad.Trans.Compose.ComposeT t1 t2), Control.Monad.Trans.Control.MonadBaseControl b m) => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Error.Class.MonadError e (t2 m)) => Control.Monad.Error.Class.MonadError e (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Reader.Class.MonadReader r (t2 m)) => Control.Monad.Reader.Class.MonadReader r (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (GHC.Base.Monad (t1 (t2 m)), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Writer.Class.MonadWriter w (t2 m)) => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 m), Control.Monad.Trans.Class.MonadTrans t1, Control.Monad.Trans.Class.MonadTrans t2) => Control.Monad.Trans.Class.MonadTrans (Control.Monad.Trans.Compose.ComposeT t1 t2)
+ Control.Monad.Trans.Compose: instance (forall (m :: * -> *). GHC.Base.Monad m => GHC.Base.Monad (t2 m), Control.Monad.Trans.Control.MonadTransControl t1, Control.Monad.Trans.Control.MonadTransControl t2) => Control.Monad.Trans.Control.MonadTransControl (Control.Monad.Trans.Compose.ComposeT t1 t2)
+ Control.Monad.Trans.Compose: instance GHC.Base.Applicative (t1 (t2 m)) => GHC.Base.Applicative (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance GHC.Base.Functor (t1 (t2 m)) => GHC.Base.Functor (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: instance GHC.Base.Monad (t1 (t2 m)) => GHC.Base.Monad (Control.Monad.Trans.Compose.ComposeT t1 t2 m)
+ Control.Monad.Trans.Compose: newtype ComposeT (t1 :: (Type -> Type) -> Type -> Type) (t2 :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
+ Control.Monad.Trans.Compose: 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))
+ Control.Monad.Trans.Compose: runComposeT' :: (t1 (t2 m) a -> t2 m a) -> (t2 m a -> m a) -> ComposeT t1 t2 m a -> m a
+ Control.Monad.Trans.Elevator: Ascend :: t m a -> Elevator (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)
+ Control.Monad.Trans.Elevator: [descend] :: Elevator (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type) -> t m a
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Class.MonadTrans t, Control.Monad.Base.MonadBase b m) => Control.Monad.Base.MonadBase b (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Class.MonadTrans t, Control.Monad.IO.Class.MonadIO m) => Control.Monad.IO.Class.MonadIO (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Class.MonadTrans t, Control.Monad.State.Class.MonadState s m) => Control.Monad.State.Class.MonadState s (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Control.MonadTransControl t, Control.Monad.Error.Class.MonadError e m) => Control.Monad.Error.Class.MonadError e (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Control.MonadTransControl t, Control.Monad.Reader.Class.MonadReader r m) => Control.Monad.Reader.Class.MonadReader r (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Control.MonadTransControl t, Control.Monad.Trans.Control.MonadBaseControl b m) => Control.Monad.Trans.Control.MonadBaseControl b (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance (GHC.Base.Monad (t m), Control.Monad.Trans.Control.MonadTransControl t, Control.Monad.Writer.Class.MonadWriter w m) => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance GHC.Base.Applicative (t m) => GHC.Base.Applicative (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance GHC.Base.Functor (t m) => GHC.Base.Functor (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: instance GHC.Base.Monad (t m) => GHC.Base.Monad (Control.Monad.Trans.Elevator.Elevator t m)
+ Control.Monad.Trans.Elevator: newtype Elevator (t :: (Type -> Type) -> Type -> Type) (m :: Type -> Type) (a :: Type)

Files

CHANGELOG.md view
@@ -1,5 +1,9 @@ # Revision history for deriving-trans +## 0.2.0.0 *25 Jan 2022*++* Completely change the idea of this project. Pretty much everything has been changed.+ ## 0.1.0.0 *19 Jun 2021*  * First version. Released on an unsuspecting world.
deriving-trans.cabal view
@@ -1,10 +1,13 @@+cabal-version:       3.0 name:                deriving-trans-version:             0.1.0.0-synopsis:            Derive transformer type classes with DerivingVia-description:         MonadTrans is a prime example of a type class, that is not derivable with-                     GeneralizedNewtypeDeriving.-                     A simple way to still derive such an instance is by using DerivingVia.-license:             BSD3+version:             0.2.0.0+synopsis:            Derive monad type classes with DerivingVia+description:         Deriving type class instances for monad transformer stacks can be tedious.+                     By actually composing transformers with `ComposeT` we don't need to implement+                     each type class for each transformer.+                     Instead we need a single instance for `Elevator`, which will then help us pick+                     the correct instance with DerivingVia.+license:             BSD-3-Clause license-file:        LICENSE author:              Felix Springer maintainer:          felixspringer149@gmail.com@@ -13,38 +16,41 @@ category:            Control build-type:          Simple extra-source-files:  CHANGELOG.md-cabal-version:       >= 1.10  library-  exposed-modules:     Control.Monad.Trans.Deriving+  exposed-modules:+    Control.Monad.Trans.Compose+    Control.Monad.Trans.Elevator   --other-modules:-  build-depends:       base              >= 4.5     && < 5-                     , lifted-base       >= 0.2.3.2 && < 0.2.4-                     , monad-control     >= 1.0.2.0 && < 1.1-                     , mtl               >= 2.2.2   && < 2.3-                     , transformers      >= 0.5.6.2 && < 0.5.7-                     , transformers-base >= 0.4.5.2 && < 0.5-  hs-source-dirs:      src-  default-language:    Haskell2010-  default-extensions:  BangPatterns-                       ConstraintKinds-                       DataKinds-                       DeriveFoldable-                       DeriveFunctor-                       DeriveGeneric-                       DeriveTraversable-                       DerivingStrategies-                       DerivingVia-                       EmptyDataDeriving-                       FlexibleContexts-                       FlexibleInstances-                       FunctionalDependencies-                       GeneralizedNewtypeDeriving-                       MultiParamTypeClasses-                       NamedFieldPuns-                       OverloadedStrings-                       RankNTypes-                       StandaloneDeriving-                       TypeApplications-                       TypeFamilies-  ghc-options:         -Wall+  build-depends:+    , base              >= 4.5     && < 5+    , lifted-base       >= 0.2.3.2 && < 0.2.4+    , monad-control     >= 1.0.2.0 && < 1.1+    , mtl               >= 2.2.2   && < 2.3+    , transformers      >= 0.5.6.2 && < 0.5.7+    , transformers-base >= 0.4.5.2 && < 0.5+  hs-source-dirs: src+  default-language: Haskell2010+  default-extensions:+    BangPatterns+    ConstraintKinds+    DataKinds+    DeriveFoldable+    DeriveFunctor+    DeriveGeneric+    DeriveTraversable+    DerivingStrategies+    DerivingVia+    EmptyDataDeriving+    FlexibleContexts+    FlexibleInstances+    FunctionalDependencies+    GeneralizedNewtypeDeriving+    MultiParamTypeClasses+    NamedFieldPuns+    OverloadedStrings+    RankNTypes+    StandaloneDeriving+    TypeApplications+    TypeFamilies+  ghc-options: -Wall
+ src/Control/Monad/Trans/Compose.hs view
@@ -0,0 +1,96 @@+{-# LANGUAGE QuantifiedConstraints, UndecidableInstances #-}++module Control.Monad.Trans.Compose where++import Control.Monad.Base+import Control.Monad.Error.Class+import Control.Monad.IO.Class+import Control.Monad.Reader.Class+import Control.Monad.State.Class+import Control.Monad.Trans+import Control.Monad.Trans.Control+import Control.Monad.Trans.Elevator+import Control.Monad.Writer.Class+import Data.Kind++newtype ComposeT+  (t1 :: (Type -> Type) -> Type -> Type)+  (t2 :: (Type -> Type) -> Type -> Type)+  (m :: Type -> Type)+  (a :: Type)+    = ComposeT { deComposeT :: t1 (t2 m) a }+  deriving newtype (Applicative, Functor, Monad)++instance (forall m. Monad m => Monad (t2 m), MonadTrans t1, MonadTrans t2) => MonadTrans (ComposeT t1 t2) where+  lift = ComposeT . lift . 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 f = defaultLiftWith2 ComposeT deComposeT $ \ x -> f x+  restoreT = defaultRestoreT2 ComposeT++-- | Elevated to `m`.+deriving via Elevator (ComposeT t1 t2) m+  instance+    ( Monad (t1 (t2 m))+    , MonadTrans (ComposeT t1 t2)+    , MonadIO m+    ) => MonadIO (ComposeT t1 t2 m)++-- | Elevated to `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)++-- | Elevated to `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)++-- | Elevated to `t2 m`.+deriving via Elevator t1 (t2 (m :: * -> *))+  instance+    ( Monad (t1 (t2 m))+    , MonadTransControl t1+    , MonadError e (t2 m)+    ) => MonadError e (ComposeT t1 t2 m)++-- | Elevated to `t2 m`.+deriving via Elevator t1 (t2 (m :: * -> *))+  instance+    ( Monad (t1 (t2 m))+    , MonadTransControl t1+    , MonadReader r (t2 m)+    ) => MonadReader r (ComposeT t1 t2 m)++-- | Elevated to `t2 m`.+deriving via Elevator t1 (t2 (m :: * -> *))+  instance+    ( Monad (t1 (t2 m))+    , MonadTrans t1+    , MonadState s (t2 m)+    ) => MonadState s (ComposeT t1 t2 m)++-- | Elevated to `t2 m`.+deriving via Elevator t1 (t2 (m :: * -> *))+  instance+    ( Monad (t1 (t2 m))+    , MonadTransControl t1+    , MonadWriter w (t2 m)+    ) => MonadWriter w (ComposeT t1 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 runT1 runT2 = runT2 . runT1 . deComposeT++runComposeT' :: (t1 (t2 m) a -> t2 m a)+             -> (t2 m a -> m a)+             -> (ComposeT t1 t2 m a -> m a)+runComposeT' runT1 runT2 = runT2 . runT1 . deComposeT
− src/Control/Monad/Trans/Deriving.hs
@@ -1,67 +0,0 @@-{-# 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 { unStack0T :: m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)--instance MonadTrans Stack0T where-  lift = Stack0T--instance MonadTransControl Stack0T where-  type StT Stack0T a = a-  liftWith f = Stack0T $ f unStack0T-  restoreT = Stack0T--newtype Stack1T-  (t :: (Type -> Type) -> Type -> Type)-  (m :: Type -> Type)-  (a :: Type)-    = Stack1T { unStack1T :: t m a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b, MonadTrans, MonadTransControl)--newtype Stack2T-  (t1 :: (Type -> Type) -> Type -> Type)-  (t2 :: (Type -> Type) -> Type -> Type)-  (m :: Type -> Type)-  (a :: Type)-    = Stack2T { unStack2T :: t1 (t2 m) a }-  deriving (Applicative, Functor, Monad, MonadBase b, MonadBaseControl b)--instance (forall m. Monad m => Monad (t2 m), MonadTrans t1, MonadTrans t2) => MonadTrans (Stack2T t1 t2) where-  lift = Stack2T . lift . 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 f = defaultLiftWith2 Stack2T unStack2T $ \x -> f x-  restoreT = defaultRestoreT2 Stack2T--newtype Stack3T-  (t1 :: (Type -> Type) -> Type -> Type)-  (t2 :: (Type -> Type) -> Type -> Type)-  (t3 :: (Type -> Type) -> Type -> Type)-  (m :: Type -> Type)-  (a :: Type)-    = Stack3T { unStack3T :: t1 (t2 (t3 m)) a }-  deriving (Applicative, Functor, 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 = Stack3T . lift . lift . 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 f = Stack3T $ liftWith $ \run -> liftWith $ \run' -> liftWith $ \ run'' -> f $ run'' . run' . run . unStack3T-  restoreT = Stack3T . restoreT . restoreT . restoreT
+ src/Control/Monad/Trans/Elevator.hs view
@@ -0,0 +1,50 @@+{-# LANGUAGE QuantifiedConstraints, UndecidableInstances, TupleSections #-}++module Control.Monad.Trans.Elevator where++import Control.Monad.Base+import Control.Monad.Error.Class+import Control.Monad.Reader.Class+import Control.Monad.State.Class+import Control.Monad.Trans+import Control.Monad.Trans.Control+import Control.Monad.Writer.Class+import Data.Kind++newtype Elevator+  (t :: (Type -> Type) -> Type -> Type)+  (m :: Type -> Type)+  (a :: Type)+    = Ascend { descend :: t m a }+  deriving newtype (Applicative, Functor, Monad)++instance (Monad (t m), MonadTrans t, MonadBase b m) => MonadBase b (Elevator t m) where+  liftBase = Ascend . lift . liftBase++instance (Monad (t m), MonadTransControl t, MonadBaseControl b m) => MonadBaseControl b (Elevator t m) where+  type StM (Elevator t m) a = StM m (StT t a)+  liftBaseWith f = Ascend $ liftWith $ \ runT -> liftBaseWith $ \ runInBase -> f $ runInBase . runT . descend+  restoreM = Ascend . restoreT . restoreM++instance (Monad (t m), MonadTrans t, MonadIO m) => MonadIO (Elevator t m) where+  liftIO = Ascend . lift . liftIO++instance (Monad (t m), MonadTransControl t, MonadError e m) => MonadError e (Elevator t m) where+  throwError = Ascend . lift . throwError+  catchError throwing catching = Ascend $ (restoreT . pure =<<) $ liftWith $ \ runT ->+    catchError (runT $ descend throwing) (runT . descend . catching)++instance (Monad (t m), MonadTransControl t, MonadReader r m) => MonadReader r (Elevator t m) where+  ask = Ascend $ lift ask+  local f tma = Ascend $ (restoreT . pure =<<) $ liftWith $ \ runT ->+    local f $ runT $ descend tma++instance (Monad (t m), MonadTrans t, MonadState s m) => MonadState s (Elevator t m) where+  get = Ascend $ lift get+  put = Ascend . lift . put++instance (Monad (t m), MonadTransControl t, MonadWriter w m) => MonadWriter w (Elevator t m) where+  tell = Ascend . lift . tell+  listen tma = Ascend $ liftWith (\ runT -> listen $ runT $ descend tma) >>= \ (sta, w) ->+    (, w) <$> restoreT (pure sta)+  pass tma = Ascend $ lift . pass . pure =<< descend tma