@@ -44,6 +44,7 @@ module Streamly.Internal.Data.Unfold.Type
44 -- * Nesting
44 -- * Nesting
45 , ConcatState (..)
45 , ConcatState (..)
48 -- Applicative
49 -- Applicative
49 , apSequence
50 , apSequence
@@ -690,3 +691,87 @@ instance Monad m => Arrow (Unfold m) where
690 {-# INLINE (***) #-}
691 {-# INLINE (***) #-}
691 u1 *** u2 = zipWith (,) (lmap fst u1) (lmap snd u2)
692 u1 *** u2 = zipWith (,) (lmap fst u1) (lmap snd u2)
695+------------------------------------------------------------------------------
697+------------------------------------------------------------------------------
699+-- We can possibly have an "interleave" operation to interleave the streams
702+-- interleave :: Unfold m x a -> Unfold m x a -> Unfold m (x, x) a
704+-- Alternatively, we can use a signature like zipWith:
705+-- interleave :: Unfold m x a -> Unfold m x a -> Unfold m x a
707+-- We can implement this in terms of manyInterleave, but that may
708+-- not be as efficient as a custom implementation.
710+-- Similarly we can also have other binary combining ops like append, mergeBy.
711+-- We already have zipWith.
714+data ManyInterleaveState o i =
715+ ManyInterleaveOuter o [i]
716+ | ManyInterleaveInner o [i]
717+ | ManyInterleaveInnerL [i] [i]
718+ | ManyInterleaveInnerR [i] [i]
720+-- | 'Streamly.Internal.Data.Stream.IsStream.unfoldManyInterleave' for
721+-- documentation and notes.
723+-- This is almost identical to unfoldManyInterleave in StreamD module.
725+-- The 'many' combinator is in fact 'manyAppend' to be more explicit in naming.
728+{-# INLINE_NORMAL manyInterleave #-}
729+manyInterleave :: Monad m => Unfold m a b -> Unfold m c a -> Unfold m c b
730+manyInterleave (Unfold istep iinject) (Unfold ostep oinject) =
737+ return (ManyInterleaveOuter ost [])
739+ {-# INLINE_LATE step #-}
740+ step (ManyInterleaveOuter o ls) = do
745+ i `seq` return (Skip (ManyInterleaveInner o' (i : ls)))
746+ Skip o' -> return $ Skip (ManyInterleaveOuter o' ls)
747+ Stop -> return $ Skip (ManyInterleaveInnerL ls [])
749+ step (ManyInterleaveInner _ []) = undefined
750+ step (ManyInterleaveInner o (st:ls)) = do
753+ Yield x s -> Yield x (ManyInterleaveOuter o (s:ls))
754+ Skip s -> Skip (ManyInterleaveInner o (s:ls))
755+ Stop -> Skip (ManyInterleaveOuter o ls)
757+ step (ManyInterleaveInnerL [] []) = return Stop
758+ step (ManyInterleaveInnerL [] rs) =
759+ return $ Skip (ManyInterleaveInnerR [] rs)
761+ step (ManyInterleaveInnerL (st:ls) rs) = do
764+ Yield x s -> Yield x (ManyInterleaveInnerL ls (s:rs))
765+ Skip s -> Skip (ManyInterleaveInnerL (s:ls) rs)
766+ Stop -> Skip (ManyInterleaveInnerL ls rs)
768+ step (ManyInterleaveInnerR [] []) = return Stop
769+ step (ManyInterleaveInnerR ls []) =
770+ return $ Skip (ManyInterleaveInnerL ls [])
772+ step (ManyInterleaveInnerR ls (st:rs)) = do
775+ Yield x s -> Yield x (ManyInterleaveInnerR (s:ls) rs)
776+ Skip s -> Skip (ManyInterleaveInnerR ls (s:rs))
777+ Stop -> Skip (ManyInterleaveInnerR ls rs)