on master help sign in
Add replicateM operation
commit29bc6648255eb15a084e5d704cc842c79c1d9198 authorHarendra Kumar <harendra.kumar@gmail.com> dateFri 16 Mar 2018, 02:41 (9 years ago) parent84542d2
3 files changed+19−1
Changelog.md+1−1 src/Streamly/Prelude.hs+9 test/Main.hs+9
Changelog.md+1−1
@@ -1,7 +1,7 @@
11## Unreleased
22
33### Enhancements
4−* Add the `scan` operation for left scan of a stream
4+* Add `replicateM`, `scan` stream operations
55* Improve performance of some stream operations (`foldl`, `dropWhile`)
66
77### Bug Fixes
src/Streamly/Prelude.hs+9
@@ -59,6 +59,7 @@ module Streamly.Prelude
5959 , mapM
6060 , mapM_
6161 , sequence
62+ , replicateM
6263
6364 -- * Zipping
6465 , zipWith
@@ -431,6 +432,14 @@ sequence m = fromStream $ go (toStream m)
431432 yield a (Just x) = a >>= \b -> yld b (Just (go x))
432433 in (runStream m1) Nothing stop yield
433434
435+replicateM :: (Streaming t, Monad m) => Int -> m a -> t m a
436+replicateM n m = fromStream $ go n
437+ where
438+ go cnt = Stream $ \_ stp yld ->
439+ if cnt <= 0
440+ then stp
441+ else m >>= \a -> yld a (Just $ go (cnt - 1))
442+
434443------------------------------------------------------------------------------
435444-- Serially Zipping Streams
436445------------------------------------------------------------------------------
test/Main.hs+9
@@ -4,6 +4,7 @@
44module Main (main) where
55
66import Control.Concurrent (threadDelay)
7+import Control.Monad (replicateM)
78import Data.Foldable (forM_)
89import Data.List (sort)
910import Test.Hspec
@@ -637,6 +638,14 @@ mixedOps = do
637638streamOperations :: Streaming t => (t IO Int, [Int], Int) -> Spec
638639streamOperations (stream, list, len) = do
639640
641+ -- Generation
642+ it "replicateM" $ do
643+ let x = return (1 :: Int)
644+ str <- A.toList . serially $ A.replicateM len x
645+ lst <- replicateM len x
646+ return $ str == lst
647+ `shouldReturn` True
648+
640649 -- Filtering
641650 it "filter all out" $ transform (A.filter (> len)) (filter (> len))
642651 it "filter all in" $ transform (A.filter (<= len)) (filter (<= len))