@@ -244,6 +244,7 @@ module Streamly.Streams.StreamD
244244 , intersperseM
245245 , intersperse
246246 , intersperseSuffix
247+ , intersperseSuffixBySpan
247248 , insertBy
248249
249250 -- * Deleting
@@ -3266,6 +3267,39 @@ intersperseSuffix action (Stream step state) = Stream step' (SuffixElem state)
32663267
32673268 step' _ (SuffixYield x next) = return $ Yield x next
32683269
3270+data SuffixSpanState s a
3271+ = SuffixSpanElem s Int
3272+ | SuffixSpanSuffix s
3273+ | SuffixSpanYield a (SuffixSpanState s a)
3274+ | SuffixSpanLast
3275+ | SuffixSpanStop
3276+
3277+-- | intersperse after every n items
3278+{-# INLINE_NORMAL intersperseSuffixBySpan #-}
3279+intersperseSuffixBySpan :: forall m a. Monad m
3280+ => Int -> m a -> Stream m a -> Stream m a
3281+intersperseSuffixBySpan n action (Stream step state) =
3282+ Stream step' (SuffixSpanElem state n)
3283+ where
3284+ {-# INLINE_LATE step' #-}
3285+ step' gst (SuffixSpanElem st i) | i > 0 = do
3286+ r <- step gst st
3287+ return $ case r of
3288+ Yield x s -> Skip (SuffixSpanYield x (SuffixSpanElem s (i - 1)))
3289+ Skip s -> Skip (SuffixSpanElem s i)
3290+ Stop -> if i == n then Stop else Skip SuffixSpanLast
3291+ step' _ (SuffixSpanElem st _) = return $ Skip (SuffixSpanSuffix st)
3292+
3293+ step' _ (SuffixSpanSuffix st) = do
3294+ action >>= \r -> return $ Skip (SuffixSpanYield r (SuffixSpanElem st n))
3295+
3296+ step' _ (SuffixSpanLast) = do
3297+ action >>= \r -> return $ Skip (SuffixSpanYield r SuffixSpanStop)
3298+
3299+ step' _ (SuffixSpanYield x next) = return $ Yield x next
3300+
3301+ step' _ (SuffixSpanStop) = return Stop
3302+
32693303{-# INLINE intersperse #-}
32703304intersperse :: Monad m => a -> Stream m a -> Stream m a
32713305intersperse a = intersperseM (return a)