aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-08-29 15:15:35 +0100
committerLouis Pilfold <louis@lpil.uk>2021-08-29 15:15:35 +0100
commitc67d4fa20c0f479238241076a6ac1e458c65f874 (patch)
treef375d0f232e14517e74028aff4862a7be4780944
parentfbd541429ab4c04e680aeaea2e3f1540b44dca59 (diff)
downloadjavascript-c67d4fa20c0f479238241076a6ac1e458c65f874.tar.gz
javascript-c67d4fa20c0f479238241076a6ac1e458c65f874.zip
Array fold
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/ffi.js4
-rw-r--r--src/gleam/javascript/array.gleam3
-rw-r--r--test/gleam/javascript/array_test.gleam17
4 files changed, 25 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 04012f9..07d70c7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,4 +3,4 @@
## Unreleased
- The `array` module was created with the `Array(element)` type and `to_list`,
- `from_list`, `map`, and `length` functions.
+ `from_list`, `map`, `fold`, and `length` functions.
diff --git a/src/ffi.js b/src/ffi.js
index 06303fc..91a2f73 100644
--- a/src/ffi.js
+++ b/src/ffi.js
@@ -9,3 +9,7 @@ export function map(thing, fn) {
export function length(thing) {
return thing.length;
}
+
+export function reduce(thing, acc, fn) {
+ return thing.reduce(fn, acc);
+}
diff --git a/src/gleam/javascript/array.gleam b/src/gleam/javascript/array.gleam
index 6c4819e..20d12d1 100644
--- a/src/gleam/javascript/array.gleam
+++ b/src/gleam/javascript/array.gleam
@@ -11,3 +11,6 @@ pub external fn length(Array(element)) -> Int =
pub external fn map(Array(a), fn(a) -> b) -> Array(b) =
"../../ffi.js" "map"
+
+pub external fn fold(Array(e), a, fn(a, e) -> a) -> a =
+ "../../ffi.js" "reduce"
diff --git a/test/gleam/javascript/array_test.gleam b/test/gleam/javascript/array_test.gleam
index 2f149a5..5bf52db 100644
--- a/test/gleam/javascript/array_test.gleam
+++ b/test/gleam/javascript/array_test.gleam
@@ -31,3 +31,20 @@ pub fn map_test() {
|> array.map(fn(a) { a + 1 })
|> array.to_list
}
+
+pub fn fold_test() {
+ assert [] =
+ []
+ |> array.from_list
+ |> array.fold([], fn(a, e) { [e, ..a] })
+
+ assert [4, 3, 2, 1] =
+ [1, 2, 3, 4]
+ |> array.from_list
+ |> array.fold([], fn(a, e) { [e, ..a] })
+
+ assert [1, 2, 3, 4] =
+ [4, 3, 2, 1]
+ |> array.from_list
+ |> array.fold([], fn(a, e) { [e, ..a] })
+}