diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | src/gleam/javascript/promise.gleam | 9 | ||||
-rw-r--r-- | test/gleam/javascript/promise_test.gleam | 23 |
3 files changed, 30 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 556e284..845f2ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,4 +8,4 @@ `to_list`, `from_list`, `map`, `fold`, `fold_right`, `get`, and `length` functions. - The `javascript/promise` module was created with the `Promise(value)` type and - `resolve`, `map`, and `then` functions. + `resolve`, `tap`, `map`, and `then` functions. diff --git a/src/gleam/javascript/promise.gleam b/src/gleam/javascript/promise.gleam index 4f8d54c..2437dc0 100644 --- a/src/gleam/javascript/promise.gleam +++ b/src/gleam/javascript/promise.gleam @@ -1,4 +1,5 @@ // TODO: docs +// TODO: labels pub external type Promise(value) pub external fn resolve(value) -> Promise(value) = @@ -9,3 +10,11 @@ pub external fn then(Promise(a), fn(a) -> Promise(b)) -> Promise(b) = pub external fn map(Promise(a), fn(a) -> b) -> Promise(b) = "../../ffi.js" "map_promise" + +pub fn tap(promise: Promise(a), callback: fn(a) -> b) -> Promise(a) { + promise + |> map(fn(a) { + callback(a) + a + }) +} diff --git a/test/gleam/javascript/promise_test.gleam b/test/gleam/javascript/promise_test.gleam index 876aefb..289714b 100644 --- a/test/gleam/javascript/promise_test.gleam +++ b/test/gleam/javascript/promise_test.gleam @@ -4,17 +4,34 @@ import gleam/javascript.{ObjectType} pub fn map_does_not_collapse_nested_promise_test() -> Promise(Promise(Int)) { promise.resolve(1) |> promise.map(promise.resolve) - |> promise.map(fn(value) { + |> promise.tap(fn(value) { // If the `Promise(Promise(Int))` collapsed into `Promise(Int)` (as they // do for normal JS promises) then this would fail as the value would be the // int value `1`. assert ObjectType = javascript.type_of(value) - value }) } +pub fn then_test() -> Promise(Int) { + promise.resolve(1) + |> promise.then(fn(a) { promise.resolve(a + 1) }) + |> promise.tap(fn(a) { assert 2 = a }) +} + pub fn then_does_collapse_nested_promise_test() -> Promise(Int) { promise.resolve(1) |> promise.then(promise.resolve) - |> promise.map(fn(value) { assert 1 = value }) + |> promise.tap(fn(value) { assert 1 = value }) +} + +pub fn map_test() -> Promise(Int) { + promise.resolve(1) + |> promise.map(fn(a) { a + 1 }) + |> promise.tap(fn(a) { assert 2 = a }) +} + +pub fn tap_test() -> Promise(Int) { + promise.resolve(1) + |> promise.tap(fn(a) { a + 1 }) + |> promise.tap(fn(a) { assert 1 = a }) } |