From d86237c4c07426d5f5df8fefd8f3e046b35ef4a4 Mon Sep 17 00:00:00 2001 From: Marcin Puc Date: Mon, 8 Mar 2021 17:07:03 +0100 Subject: Add iterator.iterate --- src/gleam/iterator.gleam | 14 ++++++++++++++ test/gleam/iterator_test.gleam | 7 +++++++ 2 files changed, 21 insertions(+) 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]) +} -- cgit v1.2.3