monadLib-compose 0.1.1 → 0.2
raw patch · 2 files changed
+26/−18 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- MonadLib.Compose: instance (ComposeM m n s t) => ComposeM (ChoiceT m) (ChoiceT n) s t
- MonadLib.Compose: instance (ComposeM m n s t) => ComposeM (ExceptionT e m) (ExceptionT e n) s t
- MonadLib.Compose: instance (ComposeM m n s t) => ComposeM (IdT m) (IdT n) s t
- MonadLib.Compose: instance (ComposeM m n s t) => ComposeM (StateT i m) (StateT i n) s t
- MonadLib.Compose: instance (Monad m) => ComposeM (ReaderT s m) (ReaderT t m) s t
+ MonadLib.Compose: derive_mapply :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> s -> p a
+ MonadLib.Compose: derive_mcompose :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> p s -> p a
+ MonadLib.Compose: instance ComposeM m n s t => ComposeM (ChoiceT m) (ChoiceT n) s t
+ MonadLib.Compose: instance ComposeM m n s t => ComposeM (ExceptionT e m) (ExceptionT e n) s t
+ MonadLib.Compose: instance ComposeM m n s t => ComposeM (IdT m) (IdT n) s t
+ MonadLib.Compose: instance ComposeM m n s t => ComposeM (StateT i m) (StateT i n) s t
+ MonadLib.Compose: instance Monad m => ComposeM (ReaderT s m) (ReaderT t m) s t
+ MonadLib.Compose: mapply :: ComposeM m n s t => m a -> s -> n a
- MonadLib.Compose: (<<<) :: (ComposeM m n s t) => m a -> n s -> n a
+ MonadLib.Compose: (<<<) :: ComposeM m n s t => m a -> n s -> n a
- MonadLib.Compose: (>>>) :: (ComposeM m n s t) => n s -> m a -> n a
+ MonadLib.Compose: (>>>) :: ComposeM m n s t => n s -> m a -> n a
- MonadLib.Compose: mcompose :: (ComposeM m n s t) => m a -> n s -> n a
+ MonadLib.Compose: mcompose :: ComposeM m n s t => m a -> n s -> n a
- MonadLib.Compose: mid :: (ReaderM m s) => m s
+ MonadLib.Compose: mid :: ReaderM m s => m s
Files
- MonadLib/Compose.hs +25/−17
- monadLib-compose.cabal +1/−1
MonadLib/Compose.hs view
@@ -28,6 +28,8 @@ , ComposeM(..) , (<<<) , (>>>)+, derive_mcompose+, derive_mapply ) where @@ -46,6 +48,11 @@ -- | Compose two monadic values from right to left. @mcompose f g@ is -- comparable to @f . g@ but for monadic values. Compare with 'Control.Category..'. mcompose :: m a -> n s -> n a+ mcompose m n = mapply m =<< n+ + -- | Apply a constant value to a composable monad.+ mapply :: m a -> s -> n a+ mapply m s = mcompose m (return s) -- | Compose two monadic values from right to left. Compare with 'Control.Category.<<<'. -- @f <<< g@ is equivalent to @mcompose f g@.@@ -59,43 +66,44 @@ (>>>) = flip mcompose infixl 1 >>> +derive_mcompose :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> p s -> p a+derive_mcompose (Iso _ openM) (Iso closeN openN) m n = closeN $ mcompose (openM m) (openN n)++derive_mapply :: ComposeM m n s t => Iso m o -> Iso n p -> o a -> s -> p a+derive_mapply (Iso _ openM) (Iso closeN _) m s = closeN $ mapply (openM m) s+ instance ComposeM ((->) s) ((->) t) s t where mcompose = (.) instance Monad m => ComposeM (ReaderT s m) (ReaderT t m) s t where- mcompose m n = do- s <- n- lift (runReaderT s m)+ mapply m s = lift (runReaderT s m) instance ComposeM (Reader s) (Reader t) s t where mcompose m n = asks $ flip runReader m . flip runReader n -derive_mcompose close open m n = do- s <- n- u <- lift $ mcompose (open m) (return s)- close u+x_mapply :: (MonadT xt, ComposeM m n s t, Monad (xt n)) + => (a -> xt n b) -> (xt m c -> m a) -> xt m c -> s -> xt n b+x_mapply close open m s = lift (open m `mapply` s) >>= close instance ComposeM m n s t => ComposeM (IdT m) (IdT n) s t where- mcompose = derive_mcompose return runIdT+ mapply = x_mapply return runIdT instance (ComposeM m n s t, Monoid w) => ComposeM (WriterT w m) (WriterT w n) s t where- mcompose = derive_mcompose puts runWriterT+ mapply = x_mapply puts runWriterT instance ComposeM m n s t => ComposeM (ExceptionT e m) (ExceptionT e n) s t where- mcompose = derive_mcompose raises runExceptionT+ mapply = x_mapply raises runExceptionT instance ComposeM m n s t => ComposeM (StateT i m) (StateT i n) s t where- mcompose m n = do- s <- n+ mapply m s = do i <- get- (u, i') <- lift $ mcompose (runStateT i m) (return s)+ (u, i') <- lift $ mapply (runStateT i m) s set i' return u instance ComposeM m n s t => ComposeM (ChoiceT m) (ChoiceT n) s t where- mcompose m n = do- s <- n- u <- lift $ mcompose (runChoiceT m) (return s)+ mapply m s = do+ u <- lift $ mapply (runChoiceT m) s case u of Nothing -> mzero- Just (a, m') -> return a `mplus` (mcompose m' (return s))+ Just (a, m') -> return a `mplus` (mapply m' s)
monadLib-compose.cabal view
@@ -7,7 +7,7 @@ -- The package version. See the Haskell package versioning policy -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for -- standards guiding when and how versions should be incremented.-Version: 0.1.1+Version: 0.2 -- A short (one-line) description of the package. Synopsis: Arrow-like monad composition for monadLib.