@@ -39,10 +39,12 @@ module Streamly.Internal.Data.Stream.Expand
3939
4040 -- ** Interleave
4141 , interleave
42+ , interleave2
4243 , interleaveFst
43− , interleaveMin
44− , interleaveFstSuffix2
4544 , interleaveFst2
45+ , interleaveFstSuffix2
46+ , interleaveMin
47+ , interleaveMin2
4648
4749 -- ** Round Robin
4850 , roundrobin
@@ -187,8 +189,9 @@ infixr 6 `append`
187189-- be used to efficiently fold an infinite lazy container of streams
188190-- 'concatMapWith' et. al.
189191--
190−-- /Not fused/
192+-- See 'append2' for a fusible alternative.
191193--
194+-- /CPS/
192195{-# INLINE append #-}
193196append :: Stream m a -> Stream m a -> Stream m a
194197append = (<>)
@@ -206,16 +209,23 @@ append = (<>)
206209-- weighting it can be used with 'concatMapWith' even on a large number of
207210-- streams.
208211--
209−-- /Not fused/
212+-- See 'interleave2' for a fusible alternative.
210213--
214+-- /CPS/
211215{-# INLINE interleave #-}
212216interleave :: Stream m a -> Stream m a -> Stream m a
213217interleave s1 s2 = fromStreamK $ K.interleave (toStreamK s1) (toStreamK s2)
214218
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)
222+
215223-- | Like `interleave` but stops interleaving as soon as the first stream
216224-- stops.
217225--
218−-- /Not fused/
226+-- See 'interleaveFst2' for a fusible alternative.
227+--
228+-- /CPS/
219229{-# INLINE interleaveFst #-}
220230interleaveFst :: Stream m a -> Stream m a -> Stream m a
221231interleaveFst s1 s2 =
@@ -224,12 +234,19 @@ interleaveFst s1 s2 =
224234-- | Like `interleave` but stops interleaving as soon as any of the two streams
225235-- stops.
226236--
227−-- /Not fused/
237+-- See 'interleaveMin2' for a fusible alternative.
238+--
239+-- /CPS/
228240{-# INLINE interleaveMin #-}
229241interleaveMin :: Stream m a -> Stream m a -> Stream m a
230242interleaveMin s1 s2 =
231243 fromStreamK $ K.interleaveMin (toStreamK s1) (toStreamK s2)
232244
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)
249+
233250-- | Interleaves the outputs of two streams, yielding elements from each stream
234251-- alternately, starting from the first stream. As soon as the first stream
235252-- 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)
315332-- >>> Stream.fold Fold.toList $ Stream.mergeBy compare s1 s2
316333-- [1,2,3,4,5,6,8]
317334--
318−-- See also: 'mergeByM2'
335+-- See 'mergeByM2' for a fusible alternative.
319336--
337+-- /CPS/
320338{-# INLINE mergeBy #-}
321339mergeBy :: (a -> a -> Ordering) -> Stream m a -> Stream m a -> Stream m a
322340mergeBy 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)
349367-- :}
350368-- [1,1,2,1,1,2,1,1,2]
351369--
352−-- See also: 'mergeByM2'
370+-- See 'mergeByM2' for a fusible alternative.
353371--
372+-- /CPS/
354373{-# INLINE mergeByM #-}
355374mergeByM
356375 :: Monad m
@@ -590,6 +609,8 @@ concatSmapMWith combine f initial =
590609--
591610-- /Caution: the stream of streams must be finite/
592611--
612+-- /CPS/
613+--
593614-- /Pre-release/
594615--
595616{-# INLINE mergeMapWith #-}