LibCore: Accept any Promise<T> in Promise::after()

This commit is contained in:
Ali Mohammad Pur 2025-06-18 08:36:30 +02:00 committed by Ali Mohammad Pur
commit e47b1cc1a2
Notes: github-actions[bot] 2025-06-25 06:21:50 +00:00

View file

@ -24,7 +24,8 @@ public:
Function<ErrorOr<void>(Result&)> on_resolution;
Function<void(ErrorType&)> on_rejection;
static NonnullRefPtr<Promise> after(Vector<NonnullRefPtr<Promise>>&& promises)
template<typename U>
static NonnullRefPtr<Promise> after(Vector<NonnullRefPtr<Promise<U>>> promises)
{
auto promise = Promise::construct();
struct Resolved : RefCounted<Resolved> {
@ -35,24 +36,32 @@ public:
size_t count { 0 };
size_t needed { 0 };
Optional<Error> error;
};
auto resolved = make_ref_counted<Resolved>(promises.size());
auto weak_promise = promise->template make_weak_ptr<Promise>();
for (auto p : promises) {
p->when_resolved([weak_promise, resolved](Result&) -> ErrorOr<void> {
p->when_resolved([weak_promise, resolved](auto&&) -> ErrorOr<void> {
if (!weak_promise || weak_promise->is_rejected())
return {};
if (++resolved->count == resolved->needed)
weak_promise->resolve({});
if (++resolved->count == resolved->needed) {
if (resolved->error.has_value())
weak_promise->reject(resolved->error.release_value());
else
weak_promise->resolve({});
}
return {};
});
p->when_rejected([weak_promise, resolved](ErrorType& error) {
++resolved->count;
if (weak_promise)
weak_promise->reject(move(error));
p->when_rejected([weak_promise, resolved](auto&& error) {
resolved->error = move(error);
if (!weak_promise)
return;
if (++resolved->count == resolved->needed)
weak_promise->reject(resolved->error.release_value());
});
promise->add_child(*p);