on master help sign in
Add the monadic iterate function
commitc7b94637c91a464ca6dd3a0875b143264a2450e1 authorAbhiroop Sarkar <asiamgenius@gmail.com> dateThu 22 Mar 2018, 22:33 (9 years ago) parent4a6f946
2 files changed+10−2
Changelog.md+1−1 src/Streamly/Prelude.hs+9−1
Changelog.md+1−1
@@ -7,7 +7,7 @@
77
88### Enhancements
99* Make `cons` right associative and provide an operator form `.:` for it
10−* Add `iterate`, `null`, `tail`, `reverse`, `replicateM`, `scan` stream operations
10+* Add `iterateM`, `iterate`, `null`, `tail`, `reverse`, `replicateM`, `scan` stream operations
1111* Improve performance of some stream operations (`foldl`, `dropWhile`)
1212
1313### Bug Fixes
src/Streamly/Prelude.hs+9−1
@@ -25,6 +25,7 @@ module Streamly.Prelude
2525 , unfoldrM
2626 , each
2727 , iterate
28+ , iterateM
2829
2930 -- * Elimination
3031 -- ** General Folds
@@ -126,8 +127,15 @@ each = Prelude.foldr cons nil
126127iterate :: Streaming t => (a -> a) -> a -> t m a
127128iterate step = fromStream . go
128129 where
129− go s = scons s (Just (go (step s)))
130+ go s = scons s (Just (go (step s)))
130131
132+-- | Iterate a monadic function from a seed value, streaming the results forever
133+iterateM :: (Streaming t, Monad m) => (a -> m a) -> m a -> t m a
134+iterateM step = fromStream . go
135+ where
136+ go ms = Stream $ \_ _ yld -> do
137+ s <- ms
138+ yld s (Just (go (step s)))
131139
132140-- | Read lines from an IO Handle into a stream of Strings.
133141fromHandle :: (Streaming t, MonadIO m) => IO.Handle -> t m String