hreader 1.0.2 → 1.1.0
raw patch · 4 files changed
+48/−29 lines, 4 filesdep +transformersdep ~monad-controlPVP ok
version bump matches the API change (PVP)
Dependencies added: transformers
Dependency ranges changed: monad-control
API changes (from Hackage documentation)
- Control.Monad.HReader: instance GHC.Generics.Constructor Control.Monad.HReader.C1_0HReaderT
- Control.Monad.HReader: instance GHC.Generics.Datatype Control.Monad.HReader.D1HReaderT
- Control.Monad.HReader: instance GHC.Generics.Selector Control.Monad.HReader.S1_0_0HReaderT
+ Control.Monad.HReader.Class: hlocal :: MonadHReader m => (HSet (MHRElements m) -> HSet (MHRElements m)) -> m a -> m a
+ Control.Monad.HReader.Class: instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Identity.IdentityT m)
+ Control.Monad.HReader.Class: instance Control.Monad.HReader.Class.MonadHReader m => Control.Monad.HReader.Class.MonadHReader (Control.Monad.Trans.Maybe.MaybeT m)
+ Control.Monad.HReader.Class: type family MHRElements m :: [*];
+ Control.Monad.HReader.Class: }
- Control.Monad.HReader.Class: class (Monad m, Applicative m) => MonadHReader m where type family MHRElements m :: [*]
+ Control.Monad.HReader.Class: class (Monad m, Applicative m) => MonadHReader m where type MHRElements m :: [*] where {
Files
- CHANGELOG.md +5/−0
- hreader.cabal +2/−1
- src/Control/Monad/HReader.hs +3/−0
- src/Control/Monad/HReader/Class.hs +38/−28
CHANGELOG.md view
@@ -1,5 +1,10 @@ # CHANGELOG +## 1.1.0+### Added+* instances of `MonadHReader` for `MaybeT` and `IdentityT`+* method 'hlocal' in `MonadHReader`+ ## 1.0.2 ### Added * added forgotten `MonadMask` instance
hreader.cabal view
@@ -1,5 +1,5 @@ name: hreader-version: 1.0.2+version: 1.1.0 synopsis: Generalization of MonadReader and ReaderT using hset license: BSD3 license-file: LICENSE@@ -41,6 +41,7 @@ , monad-control , mtl , tagged+ , transformers , transformers-base exposed-modules: Control.Monad.HReader
src/Control/Monad/HReader.hs view
@@ -19,6 +19,8 @@ import Data.Typeable import GHC.Generics +import qualified Control.Monad.Trans.Reader as Reader+ #if MIN_VERSION_mtl(2, 2, 1) import Control.Monad.Except #else@@ -78,6 +80,7 @@ instance (Monad m, Applicative m) => MonadHReader (HReaderT els m) where type MHRElements (HReaderT els m) = els askHSet = HReaderT ask+ hlocal f (HReaderT r) = HReaderT $ Reader.local f r deriving instance MFunctor (HReaderT els) deriving instance MMonad (HReaderT els)
src/Control/Monad/HReader/Class.hs view
@@ -9,6 +9,9 @@ import Control.Monad.Cont import Control.Monad.List import Control.Monad.Reader+import Control.Monad.Trans.Control+import Control.Monad.Trans.Identity+import Control.Monad.Trans.Maybe import Data.HSet import Data.Tagged import GHC.Exts@@ -22,12 +25,13 @@ 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.Trans.Cont as Cont+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)__@@ -41,27 +45,25 @@ class (Monad m, Applicative m) => MonadHReader m where type MHRElements m :: [*] askHSet :: m (HSet (MHRElements m))+ hlocal :: (HSet (MHRElements m) -> HSet (MHRElements m)) -> m a -> m a --- | Ask arbitrary element of hset inside HReader-hask :: (MonadHReader m, HGettable (MHRElements m) e)- => m e-hask = hget <$> askHSet --- | Ask arbitrary labeled element of hset in HReader-haskTagged :: (MonadHReader m, HGettable (MHRElements m) (Tagged tag e))- => proxy tag- -> m e-haskTagged p = hgetTagged p <$> askHSet+instance (MonadHReader m) => MonadHReader (ContT r m) where+ type MHRElements (ContT r m) = MHRElements m+ askHSet = lift askHSet+ hlocal = Cont.liftLocal askHSet hlocal #define MHR(MONAD) \ instance (MonadHReader m) => MonadHReader (MONAD) where { \ type MHRElements (MONAD) = MHRElements m ; \ askHSet = lift askHSet ; \+ hlocal f ma = liftThrough (hlocal f) ma ; \ } +MHR(IdentityT m) MHR(ReaderT r m)-MHR(ContT r m) MHR(ListT m)+MHR(MaybeT m) #if MIN_VERSION_mtl(2, 2, 1) MHR(ExceptT e m)@@ -70,18 +72,26 @@ MHR(SL.StateT s m) MHR(SS.StateT s m) -instance (MonadHReader m, Monoid w) => MonadHReader (WL.WriterT w m) where- type MHRElements (WL.WriterT w m) = MHRElements m- askHSet = lift askHSet -instance (MonadHReader m, Monoid w) => MonadHReader (WS.WriterT w m) where- type MHRElements (WS.WriterT w m) = MHRElements m- askHSet = lift askHSet+#define MHRWRITER(MONAD) \+instance (MonadHReader m, Monoid w) => MonadHReader (MONAD) where { \+ type MHRElements (MONAD) = MHRElements m ; \+ askHSet = lift askHSet ; \+ hlocal f ma = liftThrough (hlocal f) ma ; \+ } -instance (MonadHReader m, Monoid w) => MonadHReader (RWSL.RWST r w s m) where- type MHRElements (RWSL.RWST r w s m) = MHRElements m- askHSet = lift askHSet+MHRWRITER(WL.WriterT w m)+MHRWRITER(WS.WriterT w m)+MHRWRITER(RWSL.RWST r w s m)+MHRWRITER(RWSS.RWST r w s m) -instance (MonadHReader m, Monoid w) => MonadHReader (RWSS.RWST r w s m) where- type MHRElements (RWSS.RWST r w s m) = MHRElements m- askHSet = lift askHSet+-- | Ask arbitrary element of hset inside HReader+hask :: (MonadHReader m, HGettable (MHRElements m) e)+ => m e+hask = hget <$> askHSet++-- | Ask arbitrary labeled element of hset in HReader+haskTagged :: (MonadHReader m, HGettable (MHRElements m) (Tagged tag e))+ => proxy tag+ -> m e+haskTagged p = hgetTagged p <$> askHSet