aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/iterator.gleam17
-rw-r--r--test/gleam/iterator_test.gleam8
2 files changed, 25 insertions, 0 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam
index a2ca7d8..a4c9361 100644
--- a/src/gleam/iterator.gleam
+++ b/src/gleam/iterator.gleam
@@ -160,3 +160,20 @@ pub fn filter(iterator: Iterator(a), for predicate: fn(a) -> Bool) -> Iterator(a
|> do_filter(_, predicate)
|> opaque
}
+
+fn do_cycle(next: fn() -> Action(a), reset: fn() -> Action(a)) {
+ fn() {
+ case next() {
+ Continue(e, iterator) -> Continue(e, do_cycle(iterator, reset))
+ Stop -> do_cycle(reset, reset)()
+ }
+ }
+}
+
+// TODO: document
+pub fn cycle(iterator: Iterator(a)) -> Iterator(a) {
+ let iterator = iterator |> unopaque
+ iterator
+ |> do_cycle(_, iterator)
+ |> opaque
+}
diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam
index b587d12..447e912 100644
--- a/test/gleam/iterator_test.gleam
+++ b/test/gleam/iterator_test.gleam
@@ -99,3 +99,11 @@ pub fn repeat_test() {
|> iterator.take(_, 5)
|> expect.equal(_, [1, 1, 1, 1, 1])
}
+
+pub fn cycle_test() {
+ [1, 2, 3]
+ |> iterator.from_list
+ |> iterator.cycle
+ |> iterator.take(_, 9)
+ |> expect.equal(_, [1, 2, 3, 1, 2, 3, 1, 2, 3])
+}