From ef2905f38f913a664dbc0125863a40474d29470f Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 10 Jun 2024 15:54:37 +0100 Subject: Add Promise.race functions --- src/ffi.mjs | 8 +++ src/gleam/javascript/promise.gleam | 39 ++++++++++++++ test/gleam/javascript/promise_test.gleam | 90 +++++++++++++++++++++++++++++++- 3 files changed, 135 insertions(+), 2 deletions(-) diff --git a/src/ffi.mjs b/src/ffi.mjs index 0af2c65..7c14c10 100644 --- a/src/ffi.mjs +++ b/src/ffi.mjs @@ -139,6 +139,14 @@ export function all_promises(...promises) { } } +export function race_promises(...promises) { + if (promises.length === 1) { + return Promise.race(promises[0]); + } else { + return Promise.race(promises); + } +} + export function map_new() { return new Map(); } diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam index 4a5440a..b1893ee 100644 --- a/src/gleam/javascript/promise.gleam +++ b/src/gleam/javascript/promise.gleam @@ -102,3 +102,42 @@ pub fn await_list(xs: List(Promise(a))) -> Promise(List(a)) { @external(javascript, "../../ffi.mjs", "all_promises") fn do_await_list(a: List(Promise(a))) -> Promise(Array(a)) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race2(a: Promise(a), b: Promise(a)) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race3(a: Promise(a), b: Promise(a), c: Promise(a)) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race4( + a: Promise(a), + b: Promise(a), + c: Promise(a), + d: Promise(a), +) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race5( + a: Promise(a), + b: Promise(a), + c: Promise(a), + d: Promise(a), + e: Promise(a), +) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race6( + a: Promise(a), + b: Promise(a), + c: Promise(a), + d: Promise(a), + e: Promise(a), + f: Promise(a), +) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race_list(a: List(Promise(a))) -> Promise(a) + +@external(javascript, "../../ffi.mjs", "race_promises") +pub fn race_array(a: Array(Promise(a))) -> Promise(a) diff --git a/test/gleam/javascript/promise_test.gleam b/test/gleam/javascript/promise_test.gleam index f3133df..50edd8e 100644 --- a/test/gleam/javascript/promise_test.gleam +++ b/test/gleam/javascript/promise_test.gleam @@ -1,6 +1,7 @@ -import gleam/javascript/promise.{type Promise} -import gleam/javascript/array +import gleam/io import gleam/javascript.{ObjectType} +import gleam/javascript/array +import gleam/javascript/promise.{type Promise} pub fn new_promise_test() { promise.new(fn(resolve) { resolve(1) }) @@ -211,3 +212,88 @@ pub fn await_list_test() { let assert [1, 3, 4, 6, 10, 13] = x }) } + +fn never_resolving_promise() { + promise.new(fn(_) { Nil }) +} + +pub fn race2_test() { + promise.race2(never_resolving_promise(), promise.resolve(1)) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race3_test() { + promise.race3( + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + ) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race4_test() { + promise.race4( + never_resolving_promise(), + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + ) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race5_test() { + promise.race5( + never_resolving_promise(), + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + never_resolving_promise(), + ) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race6_test() { + promise.race6( + never_resolving_promise(), + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + never_resolving_promise(), + never_resolving_promise(), + ) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race_list_test() { + promise.race_list([ + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + ]) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} + +pub fn race_array_test() { + promise.race_array( + array.from_list([ + never_resolving_promise(), + promise.resolve(1), + never_resolving_promise(), + ]), + ) + |> promise.tap(fn(x) { + let assert 1 = x + }) +} -- cgit v1.2.3