@@ -45,6 +45,7 @@ module Streamly.Prelude
45 -- generation function.
45 -- generation function.
47 , replicateM
47 , replicateM
49 , iterateM
50 , iterateM
50 , fromFoldable
51 , fromFoldable
@@ -167,13 +168,41 @@ fromFoldable = Prelude.foldr cons nil
167each :: (IsStream t, Foldable f) => f a -> t m a
168each :: (IsStream t, Foldable f) => f a -> t m a
168each = fromFoldable
169each = fromFoldable
171+-- | Create a singleton stream by executing a monadic action once. Same as
172+-- @m \`consM` nil@ but more efficient.
175+-- > toList $ once getLine
179+once :: (IsStream t, Monad m) => m a -> t m a
180+once = fromStream . S.once
182+-- | Generate a stream by performing a monadic action @n@ times.
183+replicateM :: (IsStream t, Monad m) => Int -> m a -> t m a
184+replicateM n m = fromStream $ go n
186+ go cnt = Stream $ \_ stp _ yld ->
189+ else m >>= \a -> yld a (go (cnt - 1))
191+-- | Generate a stream by repeatedly executing a monadic action forever.
192+repeatM :: (IsStream t, Monad m) => m a -> t m a
193+repeatM = fromStream . go
195+ go m = Stream $ \_ _ _ yld ->
196+ m >>= \a -> yld a (go m)
170−-- | Iterate a pure function from a seed value, streaming the results forever
198+-- | Iterate a pure function from a seed value, streaming the results forever.
171iterate :: IsStream t => (a -> a) -> a -> t m a
199iterate :: IsStream t => (a -> a) -> a -> t m a
172iterate step = fromStream . go
200iterate step = fromStream . go
174 go s = S.cons s (go (step s))
202 go s = S.cons s (go (step s))
176−-- | Iterate a monadic function from a seed value, streaming the results forever
204+-- | Iterate a monadic function from a seed value, streaming the results
177iterateM :: (IsStream t, Monad m) => (a -> m a) -> a -> t m a
206iterateM :: (IsStream t, Monad m) => (a -> m a) -> a -> t m a
178iterateM step = fromStream . go
207iterateM step = fromStream . go
@@ -559,15 +588,6 @@ sequence m = fromStream $ go (toStream m)
559 yield ma r = ma >>= \b -> yld b (go r)
588 yield ma r = ma >>= \b -> yld b (go r)
560 in (S.runStream m1) Nothing stp single yield
589 in (S.runStream m1) Nothing stp single yield
562−-- | Generate a stream by performing an action @n@ times.
563−replicateM :: (IsStream t, Monad m) => Int -> m a -> t m a
564−replicateM n m = fromStream $ go n
566− go cnt = Stream $ \_ stp _ yld ->
569− else m >>= \a -> yld a (go (cnt - 1))
571------------------------------------------------------------------------------
591------------------------------------------------------------------------------
572-- Serially Zipping Streams
592-- Serially Zipping Streams
573------------------------------------------------------------------------------
593------------------------------------------------------------------------------