conduit-merge 0.1.2.0 → 0.1.3.0
raw patch · 2 files changed
+39/−40 lines, 2 filesdep ~conduitdep ~mtlPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: conduit, mtl
API changes (from Hackage documentation)
- Data.Conduit.Merge: mergeSources :: (Ord a, Foldable f, Monad m) => f (Source m a) -> Producer m a
+ Data.Conduit.Merge: mergeSources :: (Ord a, Foldable f, Monad m) => f (ConduitT () a m ()) -> ConduitT i a m ()
- Data.Conduit.Merge: mergeSourcesOn :: (Ord b, Foldable f, Monad m) => (a -> b) -> f (Source m a) -> Producer m a
+ Data.Conduit.Merge: mergeSourcesOn :: (Ord b, Foldable f, Monad m) => (a -> b) -> f (ConduitT () a m ()) -> ConduitT i a m ()
Files
- conduit-merge.cabal +21/−25
- src/Data/Conduit/Merge.hs +18/−15
conduit-merge.cabal view
@@ -1,29 +1,25 @@-name: conduit-merge-version: 0.1.2.0-cabal-version: >=1.10-build-type: Simple-license: BSD3-license-file: LICENSE-copyright: 2016 Yuriy Syrovetskiy-maintainer: cblp@cblp.su-homepage: https://github.com/cblp/conduit-merge#readme-synopsis: Merge multiple sorted conduits-description:- See README.md-category: Conduit-author: Yuriy Syrovetskiy--source-repository head- type: git- location: https://github.com/cblp/conduit-merge+name: conduit-merge+version: 0.1.3.0+synopsis: Merge multiple sorted conduits+description: See README.md+homepage: https://github.com/cblp/conduit-merge#readme+license: BSD3+license-file: LICENSE+author: Yuriy Syrovetskiy+maintainer: cblp@cblp.su+copyright: 2016 Yuriy Syrovetskiy+category: Conduit+build-type: Simple+cabal-version: >= 1.10 library- exposed-modules:- Data.Conduit.Merge- build-depends:- base >=4.7 && <5,- conduit >=1.2.6.6 && <1.3,- mtl >=2.2.1 && <2.3+ build-depends: base >= 4.7 && < 5+ , conduit >= 1.3 && < 1.4+ , mtl default-language: Haskell2010- hs-source-dirs: src+ exposed-modules: Data.Conduit.Merge+ hs-source-dirs: src +source-repository head+ location: https://github.com/cblp/conduit-merge+ type: git
src/Data/Conduit/Merge.hs view
@@ -3,27 +3,30 @@ module Data.Conduit.Merge (mergeSources, mergeSourcesOn) where import Control.Monad.Trans (lift)-import Data.Conduit (Producer, Source, await, newResumableSource, yield, ($$++))+import Data.Conduit (ConduitT, await, sealConduitT, yield, ($$++)) import Data.Foldable (toList) import Data.List (sortOn) -- | Merge multiple sorted sources into one sorted producer.-mergeSources :: (Ord a, Foldable f, Monad m) => f (Source m a) -> Producer m a+mergeSources :: (Ord a, Foldable f, Monad m) => f (ConduitT () a m ()) -> ConduitT i a m () mergeSources = mergeSourcesOn id+{-# INLINE mergeSources #-} -- | Merge multiple sorted sources into one sorted producer using specified sorting key.-mergeSourcesOn :: (Ord b, Foldable f, Monad m) => (a -> b) -> f (Source m a) -> Producer m a-mergeSourcesOn key = mergeResumable . fmap newResumableSource . toList- where- mergeResumable sources = do+mergeSourcesOn+ :: (Ord b, Foldable f, Monad m)+ => (a -> b) -> f (ConduitT () a m ()) -> ConduitT i a m ()+mergeSourcesOn key = mergeSealed . fmap sealConduitT . toList where+ mergeSealed sources = do prefetchedSources <- lift $ traverse ($$++ await) sources go [(a, s) | (s, Just a) <- prefetchedSources]- go [] = pure ()- go sources = do- let (a, src1) : sources1 = sortOn (key . fst) sources- yield a- (src2, mb) <- lift $ src1 $$++ await- let sources2 = case mb of- Nothing -> sources1- Just b -> (b, src2) : sources1- go sources2+ go sources =+ case sortOn (key . fst) sources of+ [] -> pure ()+ (a, src1) : sources1 -> do+ yield a+ (src2, mb) <- lift $ src1 $$++ await+ let sources2 = case mb of+ Nothing -> sources1+ Just b -> (b, src2) : sources1+ go sources2