diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-12-12 12:28:53 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2020-05-26 19:19:29 +0100 |
commit | 6f119464b4cfd09a3555120e3f9370d504fb7ea0 (patch) | |
tree | 89008a958a8c5722fa883215bf501891f4000738 | |
parent | 3bbd4a1bf2d66d75a5547dcc15049174857850f6 (diff) | |
download | gleam_stdlib-6f119464b4cfd09a3555120e3f9370d504fb7ea0.tar.gz gleam_stdlib-6f119464b4cfd09a3555120e3f9370d504fb7ea0.zip |
range
-rw-r--r-- | src/gleam/iterator.gleam | 17 | ||||
-rw-r--r-- | test/gleam/iterator_test.gleam | 26 |
2 files changed, 43 insertions, 0 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam index 33ff8d0..690d66e 100644 --- a/src/gleam/iterator.gleam +++ b/src/gleam/iterator.gleam @@ -176,3 +176,20 @@ pub fn cycle(iterator: Iterator(a)) -> Iterator(a) { |> do_cycle(_, iterator) |> opaque } + +fn do_range(current, limit, inc) -> fn() -> Action(Int) { + case current == limit { + True -> fn() { Stop } + False -> fn() { Continue(current, do_range(current + inc, limit, inc)) } + } +} + +// TODO: document +pub fn range(from start, to stop) -> Iterator(Int) { + case start < stop { + True -> 1 + False -> -1 + } + |> do_range(start, stop, _) + |> opaque +} diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam index fe0a854..079d57d 100644 --- a/test/gleam/iterator_test.gleam +++ b/test/gleam/iterator_test.gleam @@ -117,3 +117,29 @@ pub fn unfold_test() { |> iterator.take(_, 5) |> expect.equal(_, []) } + +pub fn range_test() { + iterator.range(0, 0) + |> iterator.to_list + |> expect.equal(_, []) + + iterator.range(1, 1) + |> iterator.to_list + |> expect.equal(_, []) + + iterator.range(-1, -1) + |> iterator.to_list + |> expect.equal(_, []) + + iterator.range(0, 1) + |> iterator.to_list + |> expect.equal(_, [0]) + + iterator.range(0, 5) + |> iterator.to_list + |> expect.equal(_, [0, 1, 2, 3, 4]) + + iterator.range(1, -5) + |> iterator.to_list + |> expect.equal(_, [1, 0, -1, -2, -3, -4]) +} |