aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/iterator.gleam17
-rw-r--r--test/gleam/iterator_test.gleam26
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])
+}