diff --git a/Tests/LibCore/TestLibCorePromise.cpp b/Tests/LibCore/TestLibCorePromise.cpp index ac691474e2..58dc797ad1 100644 --- a/Tests/LibCore/TestLibCorePromise.cpp +++ b/Tests/LibCore/TestLibCorePromise.cpp @@ -61,6 +61,40 @@ TEST_CASE(promise_chain_handlers) EXPECT(!rejected); } +TEST_CASE(promise_map) +{ + Core::EventLoop loop; + + auto promise = MUST(Core::Promise::try_create()); + auto mapped_promise = promise->map([](int result) { + return result * 2; + }); + + loop.deferred_invoke([=] { + promise->resolve(21); + }); + + auto result = mapped_promise->await(); + EXPECT(!result.is_error()); + EXPECT_EQ(result.value(), 42); +} + +TEST_CASE(promise_map_already_resolved) +{ + Core::EventLoop loop; + + auto promise = MUST(Core::Promise::try_create()); + promise->resolve(21); + + auto mapped_promise = promise->map([](int result) { + return result * 2; + }); + + auto result = mapped_promise->await(); + EXPECT(!result.is_error()); + EXPECT_EQ(result.value(), 42); +} + TEST_CASE(threaded_promise_instantly_resolved) { Core::EventLoop loop; diff --git a/Userland/Libraries/LibCore/Promise.h b/Userland/Libraries/LibCore/Promise.h index a8595e0005..6786cdee21 100644 --- a/Userland/Libraries/LibCore/Promise.h +++ b/Userland/Libraries/LibCore/Promise.h @@ -60,9 +60,15 @@ public: // Converts a Promise to a Promise using a function func: A -> B template - RefPtr> map(Function func) + NonnullRefPtr> map(Function func) { - RefPtr> new_promise = Promise::construct(); + NonnullRefPtr> new_promise = Promise::construct(); + + if (is_resolved()) + new_promise->resolve(func(m_result_or_rejection->value())); + if (is_rejected()) + new_promise->reject(m_result_or_rejection->release_error()); + on_resolution = [new_promise, func = move(func)](Result& result) -> ErrorOr { new_promise->resolve(func(result)); return {};