conduit-merge 0.1.0.1 → 0.1.1.0
raw patch · 2 files changed
+9/−5 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Conduit.Merge: mergeSourcesOn :: (Ord b, Monad m) => (a -> b) -> [Source m a] -> Producer m a
Files
- conduit-merge.cabal +1/−1
- src/Data/Conduit/Merge.hs +8/−4
conduit-merge.cabal view
@@ -1,5 +1,5 @@ name: conduit-merge-version: 0.1.0.1+version: 0.1.1.0 cabal-version: >=1.10 build-type: Simple license: BSD3
src/Data/Conduit/Merge.hs view
@@ -1,6 +1,6 @@ {-# LANGUAGE RankNTypes #-} -module Data.Conduit.Merge (mergeSources) where+module Data.Conduit.Merge (mergeSources, mergeSourcesOn) where import Control.Monad.Trans (lift) import Data.Conduit (Producer, Source, await, newResumableSource, yield, ($$++))@@ -8,14 +8,18 @@ -- | Merge multiple sorted source into one sorted producer. mergeSources :: (Ord a, Monad m) => [Source m a] -> Producer m a-mergeSources = mergeResumable . map newResumableSource+mergeSources = mergeSourcesOn id++-- | Merge multiple sorted source into one sorted producer using specified sorting key.+mergeSourcesOn :: (Ord b, Monad m) => (a -> b) -> [Source m a] -> Producer m a+mergeSourcesOn key = mergeResumable . fmap newResumableSource where mergeResumable sources = do- prefetchedSources <- lift $ mapM ($$++ await) sources+ prefetchedSources <- lift $ traverse ($$++ await) sources go [(a, s) | (s, Just a) <- prefetchedSources] go [] = pure () go sources = do- let (a, src1) : sources1 = sortOn fst sources+ let (a, src1) : sources1 = sortOn (key . fst) sources yield a (src2, mb) <- lift $ src1 $$++ await let sources2 = case mb of