aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/iterator.gleam14
-rw-r--r--test/gleam/iterator_test.gleam7
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])
+}