aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/list.gleam34
-rw-r--r--test/gleam/list_test.gleam12
2 files changed, 46 insertions, 0 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index f69e82c..662e3f7 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -1219,3 +1219,37 @@ pub fn window(l: List(a), by n: Int) -> List(List(a)) {
pub fn window_by_2(l: List(a)) -> List(tuple(a, a)) {
zip(l, drop(l, 1))
}
+
+external fn erl_drop_while(fn(a) -> Bool, List(a)) -> List(a) =
+ "lists" "dropwhile"
+
+/// Drops the first elements in a given list for which the predicate funtion returns `True`.
+///
+/// ## Examples
+///
+/// > drop_while([1, 2, 3, 4], fun (x) { x < 3 })
+/// [3, 4]
+///
+pub fn drop_while(
+ in list: List(a),
+ satisfying predicate: fn(a) -> Bool,
+) -> List(a) {
+ erl_drop_while(predicate, list)
+}
+
+external fn erl_take_while(fn(a) -> Bool, List(a)) -> List(a) =
+ "lists" "takewhile"
+
+/// Takes the first elements in a given list for which the predicate funtion returns `True`.
+///
+/// ## Examples
+///
+/// > take_while([1, 2, 3, 4], fun (x) { x < 3 })
+/// [1, 2]
+///
+pub fn take_while(
+ in list: List(a),
+ satisfying predicate: fn(a) -> Bool,
+) -> List(a) {
+ erl_take_while(predicate, list)
+}
diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam
index 3277e47..f1acfb2 100644
--- a/test/gleam/list_test.gleam
+++ b/test/gleam/list_test.gleam
@@ -578,3 +578,15 @@ pub fn window_by_2_test() {
|> list.window_by_2
|> should.equal([])
}
+
+pub fn drop_while_test() {
+ [1, 2, 3, 4]
+ |> list.drop_while(fn(x) { x < 3 })
+ |> should.equal([3, 4])
+}
+
+pub fn take_while_test() {
+ [1, 2, 3, 4]
+ |> list.take_while(fn(x) { x < 3 })
+ |> should.equal([1, 2])
+}