aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Porto <s@porto5.com>2021-05-08 06:28:31 +1000
committerGitHub <noreply@github.com>2021-05-07 20:28:31 +0000
commit32b56eb7cd04bdd47a548b021602a018bdf782c6 (patch)
treedd55c7e7371e2938bec5eb4c613f04585122ffb1
parent7b10d02d88af84560855337e45c755686a396943 (diff)
downloadgleam_stdlib-32b56eb7cd04bdd47a548b021602a018bdf782c6.tar.gz
gleam_stdlib-32b56eb7cd04bdd47a548b021602a018bdf782c6.zip
Add list.flat_map (#202)
-rw-r--r--CHANGELOG.md1
-rw-r--r--src/gleam/list.gleam14
-rw-r--r--test/gleam/list_test.gleam5
3 files changed, 20 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f27a2eb..5c26e43 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
## Unreleased
+- The `list` module gains the `flat_map` function.
- The `option` module gains the `values` function.
- The `result` module gains the `values` function.
- All modules now use the new `#(a, b, ...)` tuple syntax.
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index ea67ba5..a0b3b16 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -452,6 +452,20 @@ pub fn flatten(lists: List(List(a))) -> List(a) {
do_flatten(lists, [])
}
+/// Map and flatten the result
+///
+/// ## Examples
+///
+/// ```
+/// > flat_map([2, 4, 6], fn(x) { [x, x + 1] })
+/// [2, 3, 4, 5, 6, 7]
+/// ```
+///
+pub fn flat_map(over list: List(a), with fun: fn(a) -> List(b)) -> List(b) {
+ map(list, fun)
+ |> flatten
+}
+
/// Reduces a list of elements into a single value by calling a given function
/// on each element, going from left to right.
///
diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam
index 1e90583..c7e2a34 100644
--- a/test/gleam/list_test.gleam
+++ b/test/gleam/list_test.gleam
@@ -165,6 +165,11 @@ pub fn flatten_test() {
|> should.equal([1, 2, 3, 4])
}
+pub fn flat_map_test() {
+ list.flat_map([1, 10, 20], fn(x) { [x, x + 1] })
+ |> should.equal([1, 2, 10, 11, 20, 21])
+}
+
pub fn fold_test() {
[1, 2, 3]
|> list.fold([], fn(x, acc) { [x, ..acc] })