conduit-extra 0.1.2 → 0.1.3
raw patch · 4 files changed
+51/−3 lines, 4 files
Files
- Data/Conduit/Extra.hs +47/−0
- Data/Conduit/Extra/ZipSink.hs +1/−1
- conduit-extra.cabal +1/−1
- test/main.hs +2/−1
Data/Conduit/Extra.hs view
@@ -1,7 +1,54 @@ module Data.Conduit.Extra ( module Data.Conduit.Extra.ZipSink , module Data.Conduit.Extra.Resumable+ , fuseLeftovers+ , fuseReturnLeftovers ) where import Data.Conduit.Extra.ZipSink import Data.Conduit.Extra.Resumable+import Data.Conduit+import Data.Conduit.Internal (Pipe (..), ConduitM (..))+import Control.Monad (liftM)+import Data.Void (absurd)++fuseLeftovers :: Monad m+ => ConduitM a b m ()+ -> ConduitM b c m r+ -> ConduitM a c m (r, [b])+fuseLeftovers (ConduitM left0) (ConduitM right0) =+ ConduitM $ goRight (return ()) [] left0 right0+ where+ goRight final bs left right =+ case right of+ HaveOutput p c o -> HaveOutput (recurse p) (c >> final) o+ NeedInput rp rc ->+ case bs of+ [] -> goLeft rp rc final left+ b:bs' -> goRight final bs' left (rp b)+ Done r2 -> PipeM (final >> return (Done (r2, bs)))+ PipeM mp -> PipeM (liftM recurse mp)+ Leftover p b -> goRight final (b:bs) left p+ where+ recurse = goRight final bs left++ goLeft rp rc final left =+ case left of+ HaveOutput left' final' o -> goRight final' [] left' (rp o)+ NeedInput left' lc -> NeedInput (recurse . left') (recurse . lc)+ Done r1 -> goRight (return ()) [] (Done r1) (rc r1)+ PipeM mp -> PipeM (liftM recurse mp)+ Leftover left' i -> Leftover (recurse left') i+ where+ recurse = goLeft rp rc final++fuseReturnLeftovers+ :: Monad m+ => ([b] -> [a])+ -> ConduitM a b m ()+ -> ConduitM b c m r+ -> ConduitM a c m r+fuseReturnLeftovers f left right = do+ (r, bs) <- fuseLeftovers left right+ mapM_ leftover $ reverse $ f bs+ return r
Data/Conduit/Extra/ZipSink.hs view
@@ -4,7 +4,7 @@ , broadcast ) where -#if MIN_VERSION_conduit(1, 0, 13)+#if MIN_VERSION_conduit(1, 0, 13) || FPHC import Data.Conduit (ZipSink (..), sequenceSinks, Sink) import Data.Traversable (Traversable)
conduit-extra.cabal view
@@ -1,5 +1,5 @@ Name: conduit-extra-Version: 0.1.2+Version: 0.1.3 Synopsis: Experimental helper functions for conduit. Description: This package is meant as a testing ground for new concepts in conduit. The idea is to have a much lower barrier to entry for this library relative to conduit itself. This way, conduit itself will continue to have a best-practices, minimal, stable API, while people are free to try crazy new features.
test/main.hs view
@@ -12,6 +12,7 @@ import qualified Data.Conduit.List as CL import qualified Data.Conduit.Extra as CE import Data.Conduit (runResourceT)+import qualified Data.Conduit.ExtraSpec as ES main :: IO ()@@ -31,4 +32,4 @@ x <- runResourceT $ CL.sourceList [100,99..1] $$ sink x `shouldBe` (505000 :: Integer) - return ()+ ES.spec