streaming-eversion 0.3.0.1 → 0.3.1.0
raw patch · 4 files changed
+54/−10 lines, 4 files
Files
- CHANGELOG +5/−2
- src/Streaming/Eversion.hs +26/−3
- src/Streaming/Eversion/Pipes.hs +22/−4
- streaming-eversion.cabal +1/−1
CHANGELOG view
@@ -1,12 +1,15 @@+0.3.1.0++- Added functions with MonadResource contraints.+ 0.3.0.0-=======+ - Implemented the improvements suggested by Michael Thompson here : https://groups.google.com/forum/#!topic/haskell-pipes/7n6NPTmxPKY by M.T. - Removed the newtypes. I mistakenly believed that they were needed to avoid having to enable -XImpredicativeTypes. 0.2.0.0-======= - Eversible, not Evertible! - Removed special purpose error functions.
src/Streaming/Eversion.hs view
@@ -5,7 +5,7 @@ {-| Most pull-to-push transformations in this module require functions that are polymorphic over a monad transformer. - Because of this, some of the type signatures look internals, but actually many+ Because of this, some of the type signatures look scary, but actually many (suitably polymorphic) operations on 'Stream's will unify with them. To get "interruptible" operations that can exit early with an error, put a@@ -24,10 +24,13 @@ , evertM_ , evertMIO , evertMIO_+ , evertMR+ , evertMR_ -- * Stream transformations , transvert , transvertM , transvertMIO+ , transvertMR -- * Internals -- , Feed(..) , generalEvertM@@ -36,7 +39,7 @@ import Prelude import Control.Foldl (Fold(..),FoldM(..),generalize,simplify)-import Streaming (Stream,Of(..),Sum(..),inspect,unseparate)+import Streaming (Stream,Of(..),Sum(..),inspect,unseparate,MonadResource) import Streaming.Internal import Control.Monad.IO.Class import Control.Monad.Trans.Class@@ -47,7 +50,7 @@ >>> import Control.Monad.Trans.Identity >>> import Control.Foldl (Fold(..),FoldM(..)) >>> import qualified Control.Foldl as L->>> import Streaming (Stream,Of(..))+>>> import Streaming (Stream,Of(..),MonadResource,runResourceT) >>> import Streaming.Prelude (yield,next,for) >>> import qualified Streaming.Prelude as S -}@@ -116,6 +119,20 @@ -> FoldM m a () -- ^ evertMIO_ phi = evertMIO (fmap (fmap ((:>) ())) phi) +evertMR :: MonadResource m => (forall t r. (MonadTrans t, MonadResource (t m)) => Stream (Of a) (t m) r -> t m (Of x r)) + -> FoldM m a x -- ^+evertMR phi = generalEvertM phi++{-| + +>>> runResourceT (L.foldM (evertMR_ (S.writeFile "/dev/null")) ["aaa","bbb"]) ++-}+evertMR_ :: MonadResource m => (forall t r. (MonadTrans t, MonadResource (t m)) => Stream (Of a) (t m) r -> t m r) + -> FoldM m a () -- ^+evertMR_ phi = evertMR (fmap (fmap ((:>) ())) phi)++ generalEvertM :: (Monad m) => (forall r. Stream (Of a) (Stream ((->) (Feed a)) m) r -> Stream ((->) (Feed a)) m (Of b r)) -> FoldM m a b -- ^@@ -152,6 +169,12 @@ -> FoldM m b x -- ^ -> FoldM m a x transvertMIO phi = generalTransvertM phi++transvertMR :: MonadResource m + => (forall t r. (MonadTrans t, MonadResource (t m)) => Stream (Of a) (t m) r -> Stream (Of b) (t m) r)+ -> FoldM m b x -- ^+ -> FoldM m a x+transvertMR phi = generalTransvertM phi data Pair a b = Pair !a !b
src/Streaming/Eversion/Pipes.hs view
@@ -10,10 +10,13 @@ , evertM_ , evertMIO , evertMIO_+-- , evertMR+-- , evertMR_ -- * Producer transformations , transvert , transvertM , transvertMIO+-- , transvertMR -- * Examples -- $examples ) where@@ -21,7 +24,7 @@ import Control.Monad.IO.Class import Control.Monad.Trans.Class -import Streaming(Of(..))+import Streaming(MonadResource,strictly) import qualified Streaming.Prelude import qualified Streaming.Eversion import Pipes@@ -49,11 +52,11 @@ evert :: (forall m r. Monad m => Producer a m r -> m (x,r)) -> Fold a x -- ^-evert phi = Streaming.Eversion.evert (\stream -> fmap (\(x,r) -> x :> r) (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))+evert phi = Streaming.Eversion.evert (\stream -> fmap strictly (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream))) evertM :: Monad m => (forall t r. (MonadTrans t, Monad (t m)) => Producer a (t m) r -> t m (x,r)) -> FoldM m a x -- ^-evertM phi = Streaming.Eversion.evertM (\stream -> fmap (\(x,r) -> x :> r) (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))+evertM phi = Streaming.Eversion.evertM (\stream -> fmap strictly (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream))) evertM_ :: Monad m => (forall t r. (MonadTrans t, Monad (t m)) => Producer a (t m) r -> t m r) -> FoldM m a () -- ^@@ -61,12 +64,20 @@ evertMIO :: MonadIO m => (forall t r. (MonadTrans t, MonadIO (t m)) => Producer a (t m) r -> t m (x,r)) -> FoldM m a x -- ^-evertMIO phi = Streaming.Eversion.evertMIO (\stream -> fmap (\(x,r) -> x :> r) (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))+evertMIO phi = Streaming.Eversion.evertMIO (\stream -> fmap strictly (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream))) evertMIO_ :: MonadIO m => (forall t r. (MonadTrans t, MonadIO (t m)) => Producer a (t m) r -> t m r) -> FoldM m a () -- ^ evertMIO_ phi = Streaming.Eversion.evertMIO_ (\stream -> phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)) +--evertMR :: MonadResource m => (forall t r. (MonadTrans t, MonadResource (t m)) => Producer a (t m) r -> t m (x,r)) +-- -> FoldM m a x -- ^+--evertMR phi = Streaming.Eversion.evertMR (\stream -> fmap strictly (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))++--evertMR_ :: MonadResource m => (forall t r. (MonadTrans t, MonadResource (t m)) => Producer a (t m) r -> t m r) +-- -> FoldM m a () -- ^+--evertMR_ phi = Streaming.Eversion.evertMR_ (\stream -> phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream))+ transvert :: (forall m r. Monad m => Producer a m r -> Producer b m r) -> Fold b x -- ^ -> Fold a x @@ -83,6 +94,13 @@ -> FoldM m b x -- ^ -> FoldM m a x transvertMIO phi = Streaming.Eversion.transvertMIO (\stream -> Streaming.Prelude.unfoldr Pipes.next (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))++--transvertMR :: MonadResource m +-- => (forall t r. (MonadTrans t, MonadResource (t m)) => Producer a (t m) r -> Producer b (t m) r)+-- -> FoldM m b x -- ^+-- -> FoldM m a x+--transvertMR phi = Streaming.Eversion.transvertMR (\stream -> Streaming.Prelude.unfoldr Pipes.next (phi (Pipes.Prelude.unfoldr Streaming.Prelude.next stream)))+ {- $examples
streaming-eversion.cabal view
@@ -1,5 +1,5 @@ Name: streaming-eversion-Version: 0.3.0.1+Version: 0.3.1.0 Cabal-Version: >=1.8.0.2 Build-Type: Simple License: BSD3