aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGiacomo Cavalieri <giacomo.cavalieri@icloud.com>2023-06-24 11:18:29 +0200
committerLouis Pilfold <louis@lpil.uk>2023-06-24 12:04:38 +0100
commit26271b6c8165854ddc2d959c7eaf070a6c14da1f (patch)
tree90f3efd5ca9dab07d2015f1fa4aa8b9932dca0f6 /src
parent7999445174abbc3a40913734b2f7131180667e35 (diff)
downloadgleam_stdlib-26271b6c8165854ddc2d959c7eaf070a6c14da1f.tar.gz
gleam_stdlib-26271b6c8165854ddc2d959c7eaf070a6c14da1f.zip
Add `list.map3`
Diffstat (limited to 'src')
-rw-r--r--src/gleam/list.gleam27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index b1acb74..dce703b 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -412,6 +412,33 @@ fn do_map2(
}
}
+/// Combines three lists into a single list using the given function.
+///
+/// If a list is longer than the others the extra elements are dropped.
+///
+pub fn map3(
+ list1: List(a),
+ list2: List(b),
+ list3: List(c),
+ with fun: fn(a, b, c) -> d,
+) -> List(d) {
+ do_map3(list1, list2, list3, fun, [])
+}
+
+fn do_map3(
+ list1: List(a),
+ list2: List(b),
+ list3: List(c),
+ fun: fn(a, b, c) -> d,
+ acc: List(d),
+) -> List(d) {
+ case list1, list2, list3 {
+ [], _, _ | _, [], _ | _, _, [] -> reverse(acc)
+ [a, ..as_], [b, ..bs], [c, ..cs] ->
+ do_map3(as_, bs, cs, fun, [fun(a, b, c), ..acc])
+ }
+}
+
/// Similar to `map` but also lets you pass around an accumulated value.
///
/// ## Examples