@@ -39,10 +39,12 @@ module Streamly.Internal.Data.Stream.Expand
40 -- ** Interleave
40 -- ** Interleave
41 , interleave
41 , interleave
42 , interleaveFst
43 , interleaveFst
44− , interleaveFstSuffix2
45 , interleaveFst2
44 , interleaveFst2
45+ , interleaveFstSuffix2
47 -- ** Round Robin
49 -- ** Round Robin
48 , roundrobin
50 , roundrobin
@@ -187,8 +189,9 @@ infixr 6 `append`
187-- be used to efficiently fold an infinite lazy container of streams
189-- be used to efficiently fold an infinite lazy container of streams
188-- 'concatMapWith' et. al.
190-- 'concatMapWith' et. al.
190−-- /Not fused/
192+-- See 'append2' for a fusible alternative.
192{-# INLINE append #-}
195{-# INLINE append #-}
193append :: Stream m a -> Stream m a -> Stream m a
196append :: Stream m a -> Stream m a -> Stream m a
194append = (<>)
197append = (<>)
@@ -206,16 +209,23 @@ append = (<>)
206-- weighting it can be used with 'concatMapWith' even on a large number of
209-- weighting it can be used with 'concatMapWith' even on a large number of
207-- streams.
210-- streams.
209−-- /Not fused/
212+-- See 'interleave2' for a fusible alternative.
211{-# INLINE interleave #-}
215{-# INLINE interleave #-}
212interleave :: Stream m a -> Stream m a -> Stream m a
216interleave :: Stream m a -> Stream m a -> Stream m a
213interleave s1 s2 = fromStreamK $ K.interleave (toStreamK s1) (toStreamK s2)
217interleave s1 s2 = fromStreamK $ K.interleave (toStreamK s1) (toStreamK s2)
219+{-# INLINE interleave2 #-}
220+interleave2 :: Monad m => Stream m a -> Stream m a -> Stream m a
221+interleave2 s1 s2 = fromStreamD $ D.interleave (toStreamD s1) (toStreamD s2)
215-- | Like `interleave` but stops interleaving as soon as the first stream
223-- | Like `interleave` but stops interleaving as soon as the first stream
218−-- /Not fused/
226+-- See 'interleaveFst2' for a fusible alternative.
219{-# INLINE interleaveFst #-}
229{-# INLINE interleaveFst #-}
220interleaveFst :: Stream m a -> Stream m a -> Stream m a
230interleaveFst :: Stream m a -> Stream m a -> Stream m a
221interleaveFst s1 s2 =
231interleaveFst s1 s2 =
@@ -224,12 +234,19 @@ interleaveFst s1 s2 =
224-- | Like `interleave` but stops interleaving as soon as any of the two streams
234-- | Like `interleave` but stops interleaving as soon as any of the two streams
227−-- /Not fused/
237+-- See 'interleaveMin2' for a fusible alternative.
228{-# INLINE interleaveMin #-}
240{-# INLINE interleaveMin #-}
229interleaveMin :: Stream m a -> Stream m a -> Stream m a
241interleaveMin :: Stream m a -> Stream m a -> Stream m a
230interleaveMin s1 s2 =
242interleaveMin s1 s2 =
231 fromStreamK $ K.interleaveMin (toStreamK s1) (toStreamK s2)
243 fromStreamK $ K.interleaveMin (toStreamK s1) (toStreamK s2)
245+{-# INLINE interleaveMin2 #-}
246+interleaveMin2 :: Monad m => Stream m a -> Stream m a -> Stream m a
247+interleaveMin2 s1 s2 =
248+ fromStreamD $ D.interleaveMin (toStreamD s1) (toStreamD s2)
233-- | Interleaves the outputs of two streams, yielding elements from each stream
250-- | Interleaves the outputs of two streams, yielding elements from each stream
234-- alternately, starting from the first stream. As soon as the first stream
251-- alternately, starting from the first stream. As soon as the first stream
235-- finishes, the output stops, discarding the remaining part of the second
252-- finishes, the output stops, discarding the remaining part of the second
@@ -315,8 +332,9 @@ roundrobin m1 m2 = fromStreamD $ D.roundRobin (toStreamD m1) (toStreamD m2)
315-- >>> Stream.fold Fold.toList $ Stream.mergeBy compare s1 s2
332-- >>> Stream.fold Fold.toList $ Stream.mergeBy compare s1 s2
316-- [1,2,3,4,5,6,8]
333-- [1,2,3,4,5,6,8]
318−-- See also: 'mergeByM2'
335+-- See 'mergeByM2' for a fusible alternative.
320{-# INLINE mergeBy #-}
338{-# INLINE mergeBy #-}
321mergeBy :: (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
339mergeBy :: (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
322mergeBy f m1 m2 = fromStreamK $ K.mergeBy f (toStreamK m1) (toStreamK m2)
340mergeBy f m1 m2 = fromStreamK $ K.mergeBy f (toStreamK m1) (toStreamK m2)
@@ -349,8 +367,9 @@ mergeBy f m1 m2 = fromStreamK $ K.mergeBy f (toStreamK m1) (toStreamK m2)
350-- [1,1,2,1,1,2,1,1,2]
368-- [1,1,2,1,1,2,1,1,2]
352−-- See also: 'mergeByM2'
370+-- See 'mergeByM2' for a fusible alternative.
354{-# INLINE mergeByM #-}
373{-# INLINE mergeByM #-}
356 :: Monad m
375 :: Monad m
@@ -590,6 +609,8 @@ concatSmapMWith combine f initial =
591-- /Caution: the stream of streams must be finite/
610-- /Caution: the stream of streams must be finite/
593-- /Pre-release/
614-- /Pre-release/
595{-# INLINE mergeMapWith #-}
616{-# INLINE mergeMapWith #-}