aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLouis Pilfold <louis@lpil.uk>2021-08-29 19:50:10 +0100
committerLouis Pilfold <louis@lpil.uk>2021-08-29 19:50:44 +0100
commit0f2807706218655c5275dbd208ed390c4918a4c5 (patch)
tree78de8c798474d3d6af3472f51ae0d2c17a4e1b96
parente57c18156cf11aaeae89e66828811c9fcc42fa81 (diff)
downloadjavascript-0f2807706218655c5275dbd208ed390c4918a4c5.tar.gz
javascript-0f2807706218655c5275dbd208ed390c4918a4c5.zip
Promise await{1,6}
-rw-r--r--CHANGELOG.md5
-rw-r--r--src/ffi.js4
-rw-r--r--src/gleam/javascript/promise.gleam37
-rw-r--r--test/gleam/javascript/promise_test.gleam43
4 files changed, 87 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index be86f89..21931e8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,9 +4,10 @@
- The `javascript` module was created with the `TypeOf`, and `Symbol` types, and
`find_symbol`, `make_reference`, `set_reference`, `update_reference`,
- `dereference` and `type_of` functions.
+ `dereference`, and `type_of` functions.
- The `javascript/array` module was created with the `Array(element)` type and
`to_list`, `from_list`, `map`, `fold`, `fold_right`, `get`, and `length`
functions.
- The `javascript/promise` module was created with the `Promise(value)` type and
- `rescue`, `resolve`, `tap`, `map_try`, `map`, `then_try` and `then` functions.
+ `rescue`, `resolve`, `tap`, `map_try`, `map`, `then_try`, `await{2,6}` and
+ `then` functions.
diff --git a/src/ffi.js b/src/ffi.js
index d7b6bf9..07649e9 100644
--- a/src/ffi.js
+++ b/src/ffi.js
@@ -118,3 +118,7 @@ export function set_reference(ref, value) {
ref.value = value;
return previous;
}
+
+export function all_promises(...promises) {
+ return Promise.all(promises);
+}
diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam
index 3c7190c..5e374dd 100644
--- a/src/gleam/javascript/promise.gleam
+++ b/src/gleam/javascript/promise.gleam
@@ -49,3 +49,40 @@ pub fn then_try(
}
})
}
+
+pub external fn await2(Promise(a), Promise(b)) -> Promise(#(a, b)) =
+ "../../ffi.js" "all_promises"
+
+pub external fn await3(
+ Promise(a),
+ Promise(b),
+ Promise(c),
+) -> Promise(#(a, b, c)) =
+ "../../ffi.js" "all_promises"
+
+pub external fn await4(
+ Promise(a),
+ Promise(b),
+ Promise(c),
+ Promise(d),
+) -> Promise(#(a, b, c, d)) =
+ "../../ffi.js" "all_promises"
+
+pub external fn await5(
+ Promise(a),
+ Promise(b),
+ Promise(c),
+ Promise(d),
+ Promise(e),
+) -> Promise(#(a, b, c, d, e)) =
+ "../../ffi.js" "all_promises"
+
+pub external fn await6(
+ Promise(a),
+ Promise(b),
+ Promise(c),
+ Promise(d),
+ Promise(e),
+ Promise(f),
+) -> Promise(#(a, b, c, d, e, f)) =
+ "../../ffi.js" "all_promises"
diff --git a/test/gleam/javascript/promise_test.gleam b/test/gleam/javascript/promise_test.gleam
index c77cd5a..942abcc 100644
--- a/test/gleam/javascript/promise_test.gleam
+++ b/test/gleam/javascript/promise_test.gleam
@@ -84,3 +84,46 @@ pub fn rescue_poisoned_test() {
|> promise.rescue(fn(_) { 100 })
|> promise.tap(fn(a) { assert 100 = a })
}
+
+pub fn await2_test() {
+ promise.await2(promise.resolve(1), promise.resolve(3))
+ |> promise.tap(fn(x) { assert #(1, 3) = x })
+}
+
+pub fn await3_test() {
+ promise.await3(promise.resolve(1), promise.resolve(3), promise.resolve(4))
+ |> promise.tap(fn(x) { assert #(1, 3, 4) = x })
+}
+
+pub fn await4_test() {
+ promise.await4(
+ promise.resolve(1),
+ promise.resolve(3),
+ promise.resolve(4),
+ promise.resolve(6),
+ )
+ |> promise.tap(fn(x) { assert #(1, 3, 4, 6) = x })
+}
+
+pub fn await5_test() {
+ promise.await5(
+ promise.resolve(1),
+ promise.resolve(3),
+ promise.resolve(4),
+ promise.resolve(6),
+ promise.resolve(10),
+ )
+ |> promise.tap(fn(x) { assert #(1, 3, 4, 6, 10) = x })
+}
+
+pub fn await6_test() {
+ promise.await6(
+ promise.resolve(1),
+ promise.resolve(3),
+ promise.resolve(4),
+ promise.resolve(6),
+ promise.resolve(10),
+ promise.resolve(13),
+ )
+ |> promise.tap(fn(x) { assert #(1, 3, 4, 6, 10, 13) = x })
+}