diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-12-12 10:47:23 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-05-26 19:19:29 +0100 |
commit | 20904ceb0f19d4d3fb6d8cf9a5a324c0938dc3fb (patch) | |
tree | 105d806c05b81a8eaa5d91574ab4a620178e68aa | |
parent | ae5730686b046cba6365989fc0f88b3b2644beee (diff) | |
download | gleam_stdlib-20904ceb0f19d4d3fb6d8cf9a5a324c0938dc3fb.tar.gz gleam_stdlib-20904ceb0f19d4d3fb6d8cf9a5a324c0938dc3fb.zip |
cycle
-rw-r--r-- | src/gleam/iterator.gleam | 17 | ||||
-rw-r--r-- | test/gleam/iterator_test.gleam | 8 |
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]) +} |