on master help sign in
Add the pure iterate function
3d12532Abhiroop Sarkar
Changelog.md+1−1
@@ -7,7 +7,7 @@
7
7
8### Enhancements
8### Enhancements
9* Make `cons` right associative and provide an operator form `.:` for it
9* Make `cons` right associative and provide an operator form `.:` for it
10−* Add `null`, `tail`, `reverse`, `replicateM`, `scan` stream operations
10+* Add `iterate`, `null`, `tail`, `reverse`, `replicateM`, `scan` stream operations
11* Improve performance of some stream operations (`foldl`, `dropWhile`)
11* Improve performance of some stream operations (`foldl`, `dropWhile`)
12
12
13### Bug Fixes
13### Bug Fixes
src/Streamly/Prelude.hs+8−1
@@ -24,6 +24,7 @@ module Streamly.Prelude
24 , unfoldr
24 , unfoldr
25 , unfoldrM
25 , unfoldrM
26 , each
26 , each
27+ , iterate
27
28
28 -- * Elimination
29 -- * Elimination
29 -- ** General Folds
30 -- ** General Folds
@@ -85,7 +86,8 @@ import Prelude hiding (filter, drop, dropWhile, take,
85 mapM, mapM_, sequence, all, any,
86 mapM, mapM_, sequence, all, any,
86 sum, product, elem, notElem,
87 sum, product, elem, notElem,
87 maximum, minimum, head, last,
88 maximum, minimum, head, last,
88− tail, length, null, reverse)
89+ tail, length, null, reverse,
90+ iterate)
89import qualified Prelude
91import qualified Prelude
90import qualified System.IO as IO
92import qualified System.IO as IO
91
93
@@ -120,6 +122,11 @@ unfoldrM step = fromStream . go
120each :: (Streaming t, Foldable f) => f a -> t m a
122each :: (Streaming t, Foldable f) => f a -> t m a
121each = Prelude.foldr cons nil
123each = Prelude.foldr cons nil
122
124
125+iterate :: Streaming t => (a -> a) -> a -> t m a
126+iterate f = fromStream . go
127+ where
128+ go s = scons s (Just (go (f s)))
129+
123-- | Read lines from an IO Handle into a stream of Strings.
130-- | Read lines from an IO Handle into a stream of Strings.
124fromHandle :: (Streaming t, MonadIO m) => IO.Handle -> t m String
131fromHandle :: (Streaming t, MonadIO m) => IO.Handle -> t m String
125fromHandle h = fromStream go
132fromHandle h = fromStream go
test/Main.hs+6
@@ -651,6 +651,12 @@ streamOperations (stream, list, len) = do
651 return $ str == lst
651 return $ str == lst
652 `shouldReturn` True
652 `shouldReturn` True
653
653
654+ it "iterate" $ do
655+ let lst = take len $ iterate (+ 1) 0
656+ str <- A.toList . serially . (A.take len) $ (A.iterate (+ 1) (0 :: Int))
657+ return $ str == lst
658+ `shouldReturn` True
659+
654 -- Filtering
660 -- Filtering
655 it "filter all out" $ transform (A.filter (> len)) (filter (> len))
661 it "filter all out" $ transform (A.filter (> len)) (filter (> len))
656 it "filter all in" $ transform (A.filter (<= len)) (filter (<= len))
662 it "filter all in" $ transform (A.filter (<= len)) (filter (<= len))