newtype-deriving 0.1.2 → 0.1.3
raw patch · 4 files changed
+115/−78 lines, 4 filesdep −eitherdep −newtype-derivingdep ~basedep ~base-preludedep ~monad-controlPVP ok
version bump matches the API change (PVP)
Dependencies removed: either, newtype-deriving
Dependency ranges changed: base, base-prelude, monad-control, transformers, transformers-base
API changes (from Hackage documentation)
Files
- demo/Main.hs +0/−31
- library/NewtypeDeriving/Rendering.hs +103/−16
- library/NewtypeDeriving/TH.hs +11/−0
- newtype-deriving.cabal +1/−31
− demo/Main.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE UndecidableInstances, TypeFamilies, FlexibleInstances,- TemplateHaskell, GeneralizedNewtypeDeriving,- MultiParamTypeClasses #-}-module Main where--import Prelude ()-import BasePrelude-import NewtypeDeriving-import Control.Monad.Base-import Control.Monad.Trans.Control-import Control.Monad.Trans.Class-import Control.Monad.Trans.Either-import Control.Monad.Trans.Maybe-import Control.Monad.Trans.State-import Control.Monad.Trans.Reader-import Control.Monad.Trans.Writer---main =- return ()---newtype T m a =- T (ReaderT Int (StateT Char (WriterT [Int] (EitherT String (MaybeT m)))) a)- deriving (Functor, Applicative, Monad)--monadTransInstance ''T-monadTransControlInstance ''T-monadBaseTransformerInstance ''T-monadBaseControlTransformerInstance ''T-
library/NewtypeDeriving/Rendering.hs view
@@ -5,7 +5,7 @@ import Control.Monad.Trans.Control import Control.Monad.Trans.Class import NewtypeDeriving.TH-import Language.Haskell.TH+import Language.Haskell.TH hiding (classP) monadTransInstance @@ -24,17 +24,49 @@ liftExp = foldl' composeExp (ConE conName) $ replicate layersCount (VarE 'lift) +-- |+-- Produces a declaration in the spirit of the following:+-- @+-- instance MonadBase b m => MonadBase b ($(pure transformerT) m) where+-- liftBase =+-- $(conE conName) . liftBase+-- @ monadBaseTransformerInstance :: Type -> Name -> Dec-monadBaseTransformerInstance transformerType conName =- head $ purifyQ $- [d|- instance MonadBase b m => MonadBase b ($(pure transformerType) m) where- liftBase =- $(conE conName) . liftBase- |]+monadBaseTransformerInstance transformerT conName =+ InstanceD cxt type_ decs+ where+ baseMonadName =+ mkName "b"+ mainMonadName =+ mkName "m"+ baseMonadT =+ VarT baseMonadName+ mainMonadT =+ VarT mainMonadName+ cxt =+ [pred]+ where+ pred =+ classP ''MonadBase [baseMonadT, mainMonadT]+ type_ =+ foldl1 AppT [ConT ''MonadBase, baseMonadT, AppT transformerT mainMonadT]+ decs =+ [liftBaseD]+ where+ liftBaseD =+ FunD 'liftBase [clause]+ where+ clause =+ Clause [] body []+ where+ body =+ NormalB exp+ where+ exp =+ composeExp (ConE conName) (VarE 'liftBase) monadTransControlInstance :: Type -- ^ Type of Newtype@@ -79,17 +111,72 @@ stType = foldl' (flip AppT) (VarT stArgName) $ map (AppT (ConT ''StT)) layers +-- |+-- Produces a declaration in the spirit of the following:+-- @+-- instance MonadBaseControl b m => MonadBaseControl b ($(pure transformerT) m) where+-- type StM ($(pure transformerT) m) a = ComposeSt $(pure transformerT) m a+-- liftBaseWith = defaultLiftBaseWith+-- restoreM = defaultRestoreM+-- @ monadBaseControlTransformerInstance :: Type -> Dec-monadBaseControlTransformerInstance t =- head $ purifyQ $- [d|- instance MonadBaseControl b m => MonadBaseControl b ($(pure t) m) where- type StM ($(pure t) m) a = ComposeSt $(pure t) m a- liftBaseWith = defaultLiftBaseWith- restoreM = defaultRestoreM- |]+monadBaseControlTransformerInstance transformerT =+ InstanceD cxt type_ decs+ where+ baseMonadName =+ mkName "b"+ mainMonadName =+ mkName "m"+ resultName =+ mkName "a"+ baseMonadT =+ VarT baseMonadName+ mainMonadT =+ VarT mainMonadName+ resultT =+ VarT resultName+ cxt =+ [pred]+ where+ pred =+ classP ''MonadBaseControl [baseMonadT, mainMonadT]+ type_ =+ AppT (AppT (ConT ''MonadBaseControl) baseMonadT) (AppT transformerT mainMonadT)+ decs =+ [stMD, liftBaseWithD, restoreMD]+ where+ stMD =+ TySynInstD ''StM eqn+ where+ eqn =+ TySynEqn [AppT transformerT mainMonadT, resultT] rhsT+ where+ rhsT =+ foldl1 AppT [ConT ''ComposeSt, transformerT, mainMonadT, resultT]+ liftBaseWithD =+ FunD 'liftBaseWith [clause]+ where+ clause =+ Clause [] body []+ where+ body =+ NormalB exp+ where+ exp =+ VarE 'defaultLiftBaseWith+ restoreMD =+ FunD 'restoreM [clause]+ where+ clause =+ Clause [] body []+ where+ body =+ NormalB exp+ where+ exp =+ VarE 'defaultRestoreM composeExp :: Exp -> Exp -> Exp composeExp a b =
library/NewtypeDeriving/TH.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} module NewtypeDeriving.TH where import BasePrelude@@ -9,3 +10,13 @@ tryToReify :: Name -> Q (Maybe Info) tryToReify n = recover (return Nothing) (fmap Just $ reify n) ++{-# INLINE classP #-}+classP :: Name -> [Type] -> Pred+#if MIN_VERSION_template_haskell(2,10,0)+classP n tl =+ foldl AppT (ConT n) tl+#else+classP =+ ClassP+#endif
newtype-deriving.cabal view
@@ -1,7 +1,7 @@ name: newtype-deriving version:- 0.1.2+ 0.1.3 synopsis: Instance derivers for newtype wrappers description:@@ -64,33 +64,3 @@ transformers >= 0.3 && < 0.5, base-prelude >= 0.1.3 && < 0.2, base >= 4.7 && < 4.9----- Well, it's not a benchmark actually, --- but in Cabal there's no better way to specify an executable, --- which is not intended for distribution.-benchmark demo- type: - exitcode-stdio-1.0- hs-source-dirs:- demo- main-is:- Main.hs- ghc-options:- -O2- -threaded- "-with-rtsopts=-N"- -funbox-strict-fields- -ddump-splices- default-language:- Haskell2010- build-depends:- newtype-deriving,- either,- monad-control,- transformers-base,- transformers,- base-prelude,- base--