diff options
-rw-r--r-- | src/gleam/iterator.gleam | 14 | ||||
-rw-r--r-- | test/gleam/iterator_test.gleam | 7 |
2 files changed, 21 insertions, 0 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam index 9bbf9d0..f441859 100644 --- a/src/gleam/iterator.gleam +++ b/src/gleam/iterator.gleam @@ -494,3 +494,17 @@ pub fn find( Stop -> Error(Nil) } } + +/// Creates an iterator that inifinitely applies a function to a value. +/// +/// ## Examples +/// +/// > iterate(1, fn(n) { n * 3 }) |> take(5) +/// [1, 3, 9, 27, 81] +/// +pub fn iterate( + from initial: element, + with f: fn(element) -> element, +) -> Iterator(element) { + unfold(initial, fn(element) { Next(element, f(element)) }) +} diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam index 0f836c6..af38508 100644 --- a/test/gleam/iterator_test.gleam +++ b/test/gleam/iterator_test.gleam @@ -250,3 +250,10 @@ pub fn find_test() { |> iterator.find(fn(cat: Cat) { cat.id == 10 }) |> should.equal(Ok(Cat(id: 10))) } + +pub fn iterate_test() { + fn(x) { x * 3 } + |> iterator.iterate(from: 1) + |> iterator.take(5) + |> should.equal([1, 3, 9, 27, 81]) +} |