@@ -112,6 +112,7 @@ module Streamly.Internal.Data.Stream.StreamD.Nesting
112 -- ** Folding
112 -- ** Folding
113 -- | Apply folds on a stream.
113 -- | Apply folds on a stream.
114 , foldMany
114 , foldMany
116 -- ** Parsing
117 -- ** Parsing
117 -- | Parsing is opposite to flattening. 'parseMany' is dual to concatMap or
118 -- | Parsing is opposite to flattening. 'parseMany' is dual to concatMap or
@@ -957,6 +958,50 @@ gintercalate
957 return $ Yield x (ICALFirstInner s1 s2 i1 i2)
958 return $ Yield x (ICALFirstInner s1 s2 i1 i2)
961+------------------------------------------------------------------------------
963+------------------------------------------------------------------------------
965+{-# ANN type FIterState Fuse #-}
966+data FIterState s f m a b
968+ | forall fs. FIterStream s (fs -> a -> m (FL.Step fs b)) fs (fs -> m b)
969+ | FIterYield b (FIterState s f m a b)
972+{-# INLINE_NORMAL foldIterateM #-}
974+ Monad m => (b -> m (FL.Fold m a b)) -> b -> Stream m a -> Stream m b
975+foldIterateM func seed0 (Stream step state) =
976+ Stream stepOuter (FIterInit state seed0)
980+ {-# INLINE iterStep #-}
981+ iterStep from st fstep extract = do
986+ FL.Partial fs -> FIterStream st fstep fs extract
987+ FL.Done fb -> FIterYield fb $ FIterInit st fb
989+ {-# INLINE_LATE stepOuter #-}
990+ stepOuter _ (FIterInit st seed) = do
991+ (FL.Fold fstep initial extract) <- func seed
992+ iterStep initial st fstep extract
993+ stepOuter gst (FIterStream st fstep fs extract) = do
994+ r <- step (adaptState gst) st
997+ iterStep (fstep fs x) s fstep extract
998+ Skip s -> return $ Skip $ FIterStream s fstep fs extract
1001+ return $ Skip $ FIterYield b FIterStop
1002+ stepOuter _ (FIterYield a next) = return $ Yield a next
1003+ stepOuter _ FIterStop = return Stop
960------------------------------------------------------------------------------
1005------------------------------------------------------------------------------
961-- Parsing
1006-- Parsing
962------------------------------------------------------------------------------
1007------------------------------------------------------------------------------