hreader 1.0.1 → 1.0.2
raw patch · 5 files changed
+117/−3 lines, 5 filesdep +hreaderdep ~basedep ~exceptionsdep ~hsetPVP ok
version bump matches the API change (PVP)
Dependencies added: hreader
Dependency ranges changed: base, exceptions, hset
API changes (from Hackage documentation)
+ Control.Monad.HReader: instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (Control.Monad.HReader.HReaderT els m)
Files
- CHANGELOG.md +4/−0
- examples/Main.hs +93/−0
- hreader.cabal +18/−1
- src/Control/Monad/HReader.hs +1/−1
- src/Control/Monad/HReader/Class.hs +1/−1
CHANGELOG.md view
@@ -1,5 +1,9 @@ # CHANGELOG +## 1.0.2+### Added+* added forgotten `MonadMask` instance+ ## 1.0.1 ### Changed * fix `Applicative` constraints for base < 4.8
+ examples/Main.hs view
@@ -0,0 +1,93 @@+module Main where++import Control.Monad.Base+import Control.Monad.HReader+import Data.HSet++type ListA = '[Int, Bool, Char]++type ListB = '[Int, Bool]++type MonadA m =+ ( MHRElemsConstraint m ListA+ , MonadBase IO m+ )++type MonadB m =+ ( MHRElemsConstraint m ListB+ , MonadBase IO m+ )++printInt+ :: (MonadBase IO m, MonadHReader m, HGettable (MHRElements m) Int)+ => m ()+printInt = do+ int <- hask+ liftBase $ print $ "int: " ++ show (int :: Int)++printBool+ :: (MonadBase IO m, MonadHReader m, HGettable (MHRElements m) Bool)+ => m ()+printBool = do+ b <- hask+ liftBase $ print $ "bool: " ++ show (b :: Bool)++printChar+ :: (MonadBase IO m, MonadHReader m, HGettable (MHRElements m) Char)+ => m ()+printChar = do+ c <- hask+ liftBase $ print $ "char: " ++ show (c :: Char)++monadA :: (MonadA m) => m ()+monadA = do+ liftBase $ print "monad A"+ printInt+ printBool+ printChar+ monadB++monadB :: (MonadB m) => m ()+monadB = do+ liftBase $ print "monad B"+ printInt+ printBool++runB :: (AllHGettable els ListB) => HSet els -> IO ()+runB h = do+ print "performing some IO actions around B"+ runHReaderT h monadB++runA :: (AllHGettable els ListA) => HSet els -> IO ()+runA h = do+ print "performing some IO actions around A"+ runHReaderT h monadA++runAinB :: (MonadB m) => m ()+runAinB = do+ liftBase $ print "running A in B"+ h <- askHSet+ let c = 'b'+ hb :: HSet ListB+ hb = subHSet h+ ha = HSCons c hb+ liftBase $ runA ha++runBinA :: (MonadA m) => m ()+runBinA = do+ liftBase $ print "running B in A"+ h <- askHSet+ liftBase $ runB h++main :: IO ()+main = do+ let+ ha :: HSet ListA+ ha = HSCons 10 $ HSCons True $ HSCons 'c' HSNil+ hb :: HSet ListB+ hb = subHSet ha+ runHReaderT ha monadA+ runHReaderT ha monadB+ runHReaderT hb monadB+ runHReaderT ha runBinA+ runHReaderT hb runAinB
hreader.cabal view
@@ -1,5 +1,5 @@ name: hreader-version: 1.0.1+version: 1.0.2 synopsis: Generalization of MonadReader and ReaderT using hset license: BSD3 license-file: LICENSE@@ -45,3 +45,20 @@ exposed-modules: Control.Monad.HReader , Control.Monad.HReader.Class+++test-suite examples+ type: exitcode-stdio-1.0+ default-language: Haskell2010+ ghc-options: -Wall+ hs-source-dirs: examples+ main-is: Main.hs++ default-extensions: ConstraintKinds+ , DataKinds+ , FlexibleContexts++ build-depends: base+ , hreader+ , hset+ , transformers-base
src/Control/Monad/HReader.hs view
@@ -35,7 +35,7 @@ } deriving ( Functor, Applicative, Monad, MonadIO , MonadError e, MonadCont, MonadWriter w , MonadState s, MonadBase b- , MonadThrow, MonadCatch+ , MonadThrow, MonadCatch, MonadMask , Typeable, Generic ) runHReaderT :: HSet els -> HReaderT els m a -> m a
src/Control/Monad/HReader/Class.hs view
@@ -34,7 +34,7 @@ -- 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 '[] = (MonadHReader m) MHRElemsConstraint m (e ': els) = (HGettable (MHRElements m) e, MHRElemsConstraint m els) -- | Monad which is a reader of HSet (or just can construct it).