aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/iterator.gleam18
-rw-r--r--test/gleam/iterator_test.gleam36
2 files changed, 34 insertions, 20 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam
index 690d66e..6f42f9c 100644
--- a/src/gleam/iterator.gleam
+++ b/src/gleam/iterator.gleam
@@ -121,6 +121,24 @@ pub fn take(from iterator: Iterator(e), up_to desired: Int) -> List(e) {
|> list.reverse
}
+fn do_drop(iterator, desired) {
+ case desired > 0 {
+ True -> case iterator() {
+ Continue(_, iterator) -> do_drop(iterator, desired - 1)
+ Stop -> fn() { Stop }
+ }
+ False -> iterator
+ }
+}
+
+// TODO: document
+pub fn drop(from iterator: Iterator(e), up_to desired: Int) -> Iterator(e) {
+ iterator
+ |> unopaque
+ |> do_drop(_, desired)
+ |> opaque
+}
+
// Transforming Iterators
fn do_map(iterator, f) {
diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam
index 079d57d..936621e 100644
--- a/test/gleam/iterator_test.gleam
+++ b/test/gleam/iterator_test.gleam
@@ -119,27 +119,23 @@ pub fn unfold_test() {
}
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])
+ let test = fn(a, b, expected) {
+ iterator.range(a, b)
+ |> iterator.to_list
+ |> expect.equal(_, expected)
+ }
- iterator.range(0, 5)
- |> iterator.to_list
- |> expect.equal(_, [0, 1, 2, 3, 4])
+ test(0, 0, [])
+ test(1, 1, [])
+ test(-1, -1, [])
+ test(0, 1, [0])
+ test(0, 5, [0, 1, 2, 3, 4])
+ test(1, -5, [1, 0, -1, -2, -3, -4])
+}
- iterator.range(1, -5)
+pub fn drop_test() {
+ iterator.range(0, 10)
+ |> iterator.drop(_, 5)
|> iterator.to_list
- |> expect.equal(_, [1, 0, -1, -2, -3, -4])
+ |> expect.equal(_, [5, 6, 7, 8, 9])
}