aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorinoas <mail@inoas.com>2022-06-25 16:40:51 +0200
committerLouis Pilfold <louis@lpil.uk>2022-07-03 22:10:45 +0100
commite8030bb1131bafbf2a5db3ab978c431cd84616fc (patch)
tree4d0766996273eba7e24b81153178b37f91a27687
parentcddb0ff3ed01f0ff13d6f98085a41b1d0866f6ad (diff)
downloadgleam_stdlib-e8030bb1131bafbf2a5db3ab978c431cd84616fc.tar.gz
gleam_stdlib-e8030bb1131bafbf2a5db3ab978c431cd84616fc.zip
add fix for List.any
-rw-r--r--src/gleam/list.gleam14
-rw-r--r--test/gleam/list_test.gleam8
2 files changed, 21 insertions, 1 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index 8beeeb9..50c7565 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -829,7 +829,19 @@ fn all_tail_recursive(
pub fn any(in list: List(a), satisfying predicate: fn(a) -> Bool) -> Bool {
case list {
[] -> False
- [x, ..rest] -> predicate(x) || any(rest, predicate)
+ list -> any_tail_recursive(list, predicate, False)
+ }
+}
+
+fn any_tail_recursive(
+ list: List(a),
+ predicate: fn(a) -> Bool,
+ accumulator: Bool,
+) -> Bool {
+ case list {
+ [] -> accumulator
+ [x, ..rest] ->
+ any_tail_recursive(rest, predicate, accumulator || predicate(x))
}
}
diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam
index 869bcf6..bde753a 100644
--- a/test/gleam/list_test.gleam
+++ b/test/gleam/list_test.gleam
@@ -301,6 +301,10 @@ pub fn all_test() {
list.all([], fn(_) { False })
|> should.equal(True)
+ list.repeat(False, 16999)
+ |> list.all(fn(_item) { False })
+ |> should.equal(False)
+
list.repeat(True, 16999)
|> list.all(fn(_item) { True })
|> should.equal(True)
@@ -319,6 +323,10 @@ pub fn any_test() {
list.repeat(True, 16999)
|> list.any(fn(_item) { True })
|> should.equal(True)
+
+ list.repeat(False, 16999)
+ |> list.any(fn(_item) { False })
+ |> should.equal(False)
}
pub fn zip_test() {