aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Puc <marcin.e.puc@gmail.com>2021-03-08 17:07:03 +0100
committerLouis Pilfold <louis@lpil.uk>2021-03-08 22:48:07 +0000
commitd86237c4c07426d5f5df8fefd8f3e046b35ef4a4 (patch)
tree5b6b1ba418cfab3cde6db289b4e000a04d1696ee
parentd19e8b4bcfd77e384e1b2e57bc342e81c1275287 (diff)
downloadgleam_stdlib-d86237c4c07426d5f5df8fefd8f3e046b35ef4a4.tar.gz
gleam_stdlib-d86237c4c07426d5f5df8fefd8f3e046b35ef4a4.zip
Add iterator.iterate
-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])
+}