hreader 0.2.0 → 1.0.0
raw patch · 4 files changed
+48/−27 lines, 4 filesdep +taggeddep ~hsetPVP ok
version bump matches the API change (PVP)
Dependencies added: tagged
Dependency ranges changed: hset
API changes (from Hackage documentation)
- Control.Monad.HReader.Class: haskLabeledM :: (MonadHReader m, HGetable (HSetElements m) (Labeled label e)) => proxy label -> m e
- Control.Monad.HReader.Class: haskM :: (MonadHReader m, HGetable (HSetElements m) e) => m e
+ Control.Monad.HReader.Class: hask :: (MonadHReader m, HGettable (MHRElements m) e) => m e
+ Control.Monad.HReader.Class: haskTagged :: (MonadHReader m, HGettable (MHRElements m) (Tagged tag e)) => proxy tag -> m e
- Control.Monad.HReader: narrowHReaderT :: (Monad m, SubHSetable els subels eq) => proxy subels -> HReaderT subels m a -> HReaderT els m a
+ Control.Monad.HReader: narrowHReaderT :: (Monad m, SubHSettable els subels) => proxy subels -> HReaderT subels m a -> HReaderT els m a
- Control.Monad.HReader: subHSetHReaderT :: (Monad m, SubHSetable els subels eq) => HReaderT subels m a -> HReaderT els m a
+ Control.Monad.HReader: subHSetHReaderT :: (Monad m, SubHSettable els subels) => HReaderT subels m a -> HReaderT els m a
- Control.Monad.HReader.Class: askHSet :: MonadHReader m => m (HSet (HSetElements m))
+ Control.Monad.HReader.Class: askHSet :: MonadHReader m => m (HSet (MHRElements m))
- Control.Monad.HReader.Class: class (Monad m, Applicative m) => MonadHReader m where type family HSetElements m :: [*]
+ Control.Monad.HReader.Class: class (Monad m, Applicative m) => MonadHReader m where type family MHRElements m :: [*]
Files
- CHANGELOG.md +8/−0
- hreader.cabal +6/−3
- src/Control/Monad/HReader.hs +3/−3
- src/Control/Monad/HReader/Class.hs +31/−21
CHANGELOG.md view
@@ -1,5 +1,13 @@ # CHANGELOG +## 1.0.0+### Added+* `MHRElemsConstraint`+### Changed+* depenes on `hset` > 2.0.0+* use `tagged` instead of Labeled+* some things renamed, so this version is not backwards compatible+ ## 0.2.0 ### Added * `subHSetHReaderT` run a local reader with a subset of HSet elements
hreader.cabal view
@@ -1,6 +1,6 @@ name: hreader-version: 0.2.0-synopsis: Generalization of MonadReader and ReaderT+version: 1.0.0+synopsis: Generalization of MonadReader and ReaderT using hset license: BSD3 license-file: LICENSE author: Aleksey Uimanov@@ -21,6 +21,7 @@ ghc-options: -Wall default-extensions: CPP+ , ConstraintKinds , DataKinds , DeriveDataTypeable , DeriveGeneric@@ -30,14 +31,16 @@ , MultiParamTypeClasses , StandaloneDeriving , TypeFamilies+ , TypeOperators , UndecidableInstances build-depends: base >= 4.7 && < 5 , exceptions- , hset >= 1.1.0 && < 2.0.0+ , hset >= 2.0.0 && < 3.0.0 , mmorph , monad-control , mtl+ , tagged , transformers-base exposed-modules: Control.Monad.HReader
src/Control/Monad/HReader.hs view
@@ -42,7 +42,7 @@ runHReaderT h (HReaderT r) = runReaderT r h -- | Run a local reader with a subset of HSet elements.-subHSetHReaderT :: ( Monad m, SubHSetable els subels eq )+subHSetHReaderT :: (Monad m, SubHSettable els subels) => HReaderT subels m a -> HReaderT els m a subHSetHReaderT hr = do hset <- askHSet@@ -61,7 +61,7 @@ -} -narrowHReaderT :: ( Monad m, SubHSetable els subels eq )+narrowHReaderT :: (Monad m, SubHSettable els subels) => proxy subels -> HReaderT subels m a -> HReaderT els m a narrowHReaderT _ = subHSetHReaderT @@ -76,7 +76,7 @@ local f $ runHReaderT h ma instance (Monad m, Applicative m) => MonadHReader (HReaderT els m) where- type HSetElements (HReaderT els m) = els+ type MHRElements (HReaderT els m) = els askHSet = HReaderT ask deriving instance MFunctor (HReaderT els)
src/Control/Monad/HReader/Class.hs view
@@ -1,7 +1,8 @@ module Control.Monad.HReader.Class ( MonadHReader(..)- , haskM- , haskLabeledM+ , MHRElemsConstraint+ , hask+ , haskTagged ) where @@ -9,6 +10,8 @@ import Control.Monad.List import Control.Monad.Reader import Data.HSet+import Data.Tagged+import GHC.Exts #if MIN_VERSION_mtl(2, 2, 1) import Control.Monad.Except@@ -19,33 +22,40 @@ import Data.Monoid #endif --import qualified Control.Monad.RWS.Lazy as RWSL-import qualified Control.Monad.RWS.Strict as RWSS-import qualified Control.Monad.State.Lazy as SL-import qualified Control.Monad.State.Strict as SS-import qualified Control.Monad.Writer.Lazy as WL-import qualified Control.Monad.Writer.Strict as WS+import qualified Control.Monad.RWS.Lazy as RWSL+import qualified Control.Monad.RWS.Strict as RWSS+import qualified Control.Monad.State.Lazy as SL+import qualified Control.Monad.State.Strict as SS+import qualified Control.Monad.Writer.Lazy as WL+import qualified Control.Monad.Writer.Strict as WS +-- | Easy generate constraint like+-- __(HGettable (MHRElements m) Int, HGettable (MHRElements m) Bool)__+-- from type list __[Int, Bool]__. Usable to reuse type lists for+-- constraints and concrete HSet.+type family MHRElemsConstraint (m :: * -> *) (els :: [*]) :: Constraint where+ MHRElemsConstraint m '[] = ()+ MHRElemsConstraint m (e ': els) = (HGettable (MHRElements m) e, MHRElemsConstraint m els) -- | Monad which is a reader of HSet (or just can construct it). class (Monad m, Applicative m) => MonadHReader m where- type HSetElements m :: [*]- askHSet :: m (HSet (HSetElements m))+ type MHRElements m :: [*]+ askHSet :: m (HSet (MHRElements m)) -- | Ask arbitrary element of hset inside HReader-haskM :: (MonadHReader m, HGetable (HSetElements m) e)+hask :: (MonadHReader m, HGettable (MHRElements m) e) => m e-haskM = hget <$> askHSet+hask = hget <$> askHSet -- | Ask arbitrary labeled element of hset in HReader-haskLabeledM :: (MonadHReader m, HGetable (HSetElements m) (Labeled label e))- => proxy label -> m e-haskLabeledM p = hgetLabeled p <$> askHSet+haskTagged :: (MonadHReader m, HGettable (MHRElements m) (Tagged tag e))+ => proxy tag+ -> m e+haskTagged p = hgetTagged p <$> askHSet #define MHR(MONAD) \ instance (MonadHReader m) => MonadHReader (MONAD) where { \- type HSetElements (MONAD) = HSetElements m ; \+ type MHRElements (MONAD) = MHRElements m ; \ askHSet = lift askHSet ; \ } @@ -61,17 +71,17 @@ MHR(SS.StateT s m) instance (MonadHReader m, Monoid w) => MonadHReader (WL.WriterT w m) where- type HSetElements (WL.WriterT w m) = HSetElements m+ type MHRElements (WL.WriterT w m) = MHRElements m askHSet = lift askHSet instance (MonadHReader m, Monoid w) => MonadHReader (WS.WriterT w m) where- type HSetElements (WS.WriterT w m) = HSetElements m+ type MHRElements (WS.WriterT w m) = MHRElements m askHSet = lift askHSet instance (MonadHReader m, Monoid w) => MonadHReader (RWSL.RWST r w s m) where- type HSetElements (RWSL.RWST r w s m) = HSetElements m+ type MHRElements (RWSL.RWST r w s m) = MHRElements m askHSet = lift askHSet instance (MonadHReader m, Monoid w) => MonadHReader (RWSS.RWST r w s m) where- type HSetElements (RWSS.RWST r w s m) = HSetElements m+ type MHRElements (RWSS.RWST r w s m) = MHRElements m askHSet = lift askHSet