packages feed

conduit-extra 0.1.2 → 0.1.3

raw patch · 4 files changed

+51/−3 lines, 4 files

Files

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