on master help sign in
Add the pure iterate function
commit3d125328a83825d5272ca70b8c8c6f42eeb7226d authorAbhiroop Sarkar <asiamgenius@gmail.com> dateThu 22 Mar 2018, 21:47 (9 years ago) parent68b6736
3 files changed+15−2
Changelog.md+1−1 src/Streamly/Prelude.hs+8−1 test/Main.hs+6
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 `null`, `tail`, `reverse`, `replicateM`, `scan` stream operations
10+* Add `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+8−1
@@ -24,6 +24,7 @@ module Streamly.Prelude
2424 , unfoldr
2525 , unfoldrM
2626 , each
27+ , iterate
2728
2829 -- * Elimination
2930 -- ** General Folds
@@ -85,7 +86,8 @@ import Prelude hiding (filter, drop, dropWhile, take,
8586 mapM, mapM_, sequence, all, any,
8687 sum, product, elem, notElem,
8788 maximum, minimum, head, last,
88− tail, length, null, reverse)
89+ tail, length, null, reverse,
90+ iterate)
8991import qualified Prelude
9092import qualified System.IO as IO
9193
@@ -120,6 +122,11 @@ unfoldrM step = fromStream . go
120122each :: (Streaming t, Foldable f) => f a -> t m a
121123each = Prelude.foldr cons nil
122124
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+
123130-- | Read lines from an IO Handle into a stream of Strings.
124131fromHandle :: (Streaming t, MonadIO m) => IO.Handle -> t m String
125132fromHandle h = fromStream go
test/Main.hs+6
@@ -651,6 +651,12 @@ streamOperations (stream, list, len) = do
651651 return $ str == lst
652652 `shouldReturn` True
653653
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+
654660 -- Filtering
655661 it "filter all out" $ transform (A.filter (> len)) (filter (> len))
656662 it "filter all in" $ transform (A.filter (<= len)) (filter (<= len))