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 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src') 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 + } + }) +} -- cgit v1.2.3