on master help sign in
Add repeatM to Streamly.Data.Stream module (#1957)
0a5dbe9Ranjeet Ranjan
core/src/Streamly/Internal/Data/Stream/Generate.hs+24−1
@@ -27,6 +27,7 @@ module Streamly.Internal.Data.Stream.Generate
27 , Stream.fromPure
27 , Stream.fromPure
28 , Stream.fromEffect
28 , Stream.fromEffect
29 , repeat
29 , repeat
30+ , repeatM
30 , replicate
31 , replicate
31
32
32 -- * Enumeration
33 -- * Enumeration
@@ -85,13 +86,15 @@ import qualified Streamly.Internal.Data.Stream.Bottom as Bottom
85import qualified Streamly.Internal.Data.Stream.StreamD as D
86import qualified Streamly.Internal.Data.Stream.StreamD as D
86import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
87import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
87import qualified Streamly.Internal.Data.Stream.Type as Stream
88import qualified Streamly.Internal.Data.Stream.Type as Stream
89+import qualified Streamly.Internal.Data.Stream.Transform as Stream (sequence)
88
90
89import Prelude hiding (iterate, replicate, repeat)
91import Prelude hiding (iterate, replicate, repeat)
90
92
91-- $setup
93-- $setup
92-- >>> :m
94-- >>> :m
93-- >>> import Control.Concurrent (threadDelay)
95-- >>> import Control.Concurrent (threadDelay)
94−-- >>> import Data.Function ((&))
96+-- >>> import Data.Function (fix, (&))
97+-- >>> import Data.Semigroup (cycle1)
95-- >>> import qualified Streamly.Data.Fold as Fold
98-- >>> import qualified Streamly.Data.Fold as Fold
96-- >>> import qualified Streamly.Data.Unfold as Unfold
99-- >>> import qualified Streamly.Data.Unfold as Unfold
97-- >>> import qualified Streamly.Internal.Data.Stream as Stream
100-- >>> import qualified Streamly.Internal.Data.Stream as Stream
@@ -178,6 +181,26 @@ unfoldrM step = fromStreamD . D.unfoldrM step
178repeat :: Monad m => a -> Stream m a
181repeat :: Monad m => a -> Stream m a
179repeat = fromStreamD . D.repeat
182repeat = fromStreamD . D.repeat
180
183
184+-- |
185+-- >>> repeatM = Stream.sequence . Stream.repeat
186+-- >>> repeatM = fix . Stream.consM
187+-- >>> repeatM = cycle1 . Stream.fromEffect
188+--
189+-- Generate a stream by repeatedly executing a monadic action forever.
190+--
191+-- >>> :{
192+-- repeatAction =
193+-- Stream.repeatM (threadDelay 1000000 >> print 1)
194+-- & Stream.take 10
195+-- & Stream.fold Fold.drain
196+-- :}
197+--
198+-- /Pre-release/
199+--
200+{-# INLINE_NORMAL repeatM #-}
201+repeatM :: Monad m => m a -> Stream m a
202+repeatM = Stream.sequence . repeat
203+
181-- |
204-- |
182-- >>> replicate n = Stream.take n . Stream.repeat
205-- >>> replicate n = Stream.take n . Stream.repeat
183--
206--