From a3018d0ab4e5d6ac0fa381d7798397554f1e5a91 Mon Sep 17 00:00:00 2001 From: YilunAllenChen Date: Sun, 15 Dec 2024 14:43:01 -0600 Subject: add min/max to gleam/list --- src/gleam/list.gleam | 52 ++++++++++++++++++++++++++++++++++++++++++++++ test/gleam/list_test.gleam | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam index 5f537b9..2d5b624 100644 --- a/src/gleam/list.gleam +++ b/src/gleam/list.gleam @@ -2311,3 +2311,55 @@ fn do_shuffle_by_pair_indexes( float.compare(a_pair.0, b_pair.0) }) } + +/// Takes a list and a comparator, and returns the maximum element in the list +/// +/// +/// ## Example +/// +/// ```gleam +/// range(1, 10) |> list.max(int.compare) +/// // -> Ok(10) +/// ``` +/// +/// ```gleam +/// ["a", "c", "b"] |> list.max(string.compare) +/// // -> Ok("c") +/// ``` +pub fn max( + over list: List(a), + with compare: fn(a, a) -> Order, +) -> Result(a, Nil) { + reduce(over: list, with: fn(acc, other) { + case compare(acc, other) { + order.Gt -> acc + _ -> other + } + }) +} + +/// Takes a list and a comparator, and returns the minimum element in the list +/// +/// +/// ## Example +/// +/// ```gleam +/// range(1, 10) |> list.int(int.compare) +/// // -> Ok(1) +/// ``` +/// +/// ```gleam +/// ["a", "c", "b"] |> list.int(string.compare) +/// // -> Ok("a") +/// ``` +pub fn min( + over list: List(a), + with compare: fn(a, a) -> Order, +) -> Result(a, Nil) { + reduce(over: list, with: fn(acc, other) { + case compare(acc, other) { + order.Lt -> acc + _ -> other + } + }) +} diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam index 79795e0..0e7e4de 100644 --- a/test/gleam/list_test.gleam +++ b/test/gleam/list_test.gleam @@ -1281,3 +1281,39 @@ pub fn shuffle_test() { list.range(0, recursion_test_cycles) |> list.shuffle() } + +pub fn max_test() { + [] + |> list.max(int.compare) + |> should.equal(Error(Nil)) + + [1, 3, 2] + |> list.max(int.compare) + |> should.equal(Ok(3)) + + [-1.0, 1.2, 1.104] + |> list.max(float.compare) + |> should.equal(Ok(1.2)) + + ["a", "c", "b"] + |> list.max(string.compare) + |> should.equal(Ok("c")) +} + +pub fn min_test() { + [] + |> list.min(int.compare) + |> should.equal(Error(Nil)) + + [1, 3, 2] + |> list.min(int.compare) + |> should.equal(Ok(1)) + + [-1.0, 1.2, 1.104] + |> list.min(float.compare) + |> should.equal(Ok(-1.0)) + + ["a", "c", "b"] + |> list.min(string.compare) + |> should.equal(Ok("a")) +} -- cgit v1.2.3