on master help sign in
Add intersperseSuffixBySpan
commitf336d5708925b17f33fd743b6a9d19dec29fc786 authorHarendra Kumar <harendra.kumar@gmail.com> dateWed 20 Nov 2019, 16:44 (7 years ago) parentbe43922
2 files changed+51
src/Streamly/Internal/Prelude.hs+17 src/Streamly/Streams/StreamD.hs+34
src/Streamly/Internal/Prelude.hs+17
@@ -208,6 +208,7 @@ module Streamly.Internal.Prelude
208208 , intersperseM
209209 , intersperse
210210 , intersperseSuffix
211+ , intersperseSuffixBySpan
211212 -- , intersperseBySpan
212213 , interjectSuffix
213214
@@ -1895,6 +1896,22 @@ intersperse a = fromStreamS . S.intersperse a . toStreamS
18951896intersperseSuffix :: (IsStream t, MonadAsync m) => m a -> t m a -> t m a
18961897intersperseSuffix m = fromStreamD . D.intersperseSuffix m . toStreamD
18971898
1899+-- | Like 'intersperseSuffix' but intersperses a monadic action into the input
1900+-- stream after every @n@ elements and after the last element.
1901+--
1902+-- @
1903+-- > S.toList $ S.intersperseSuffixBySpan 2 (return ',') $ S.fromList "hello"
1904+-- "he,ll,o,"
1905+-- @
1906+--
1907+-- /Internal/
1908+--
1909+{-# INLINE intersperseSuffixBySpan #-}
1910+intersperseSuffixBySpan :: (IsStream t, MonadAsync m)
1911+ => Int -> m a -> t m a -> t m a
1912+intersperseSuffixBySpan n eff =
1913+ fromStreamD . D.intersperseSuffixBySpan n eff . toStreamD
1914+
18981915{-
18991916-- | Intersperse a monadic action into the input stream after every @n@
19001917-- elements.
src/Streamly/Streams/StreamD.hs+34
@@ -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)