aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--src/gleam/javascript/promise.gleam9
-rw-r--r--test/gleam/javascript/promise_test.gleam23
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 })
}