/* * Copyright (c) 2021, Kyle Pereira * Copyright (c) 2022, kleines Filmröllchen * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Core { template class Promise : public Object { C_OBJECT(Promise); public: Function(Result&)> on_resolved; ErrorOr resolve(Result&& result) { m_pending_or_error = move(result); if (on_resolved) return on_resolved(m_pending_or_error->value()); return {}; } void cancel(Error error) { m_pending_or_error = move(error); } bool is_canceled() { return m_pending_or_error.has_value() && m_pending_or_error->is_error(); } bool is_resolved() const { return m_pending_or_error.has_value() && !m_pending_or_error->is_error(); } ErrorOr await() { while (!m_pending_or_error.has_value()) Core::EventLoop::current().pump(); return m_pending_or_error.release_value(); } // Converts a Promise to a Promise using a function func: A -> B template RefPtr> map(T func(Result&)) { RefPtr> new_promise = Promise::construct(); on_resolved = [new_promise, func](Result& result) { auto t = func(result); return new_promise->resolve(move(t)); }; return new_promise; } private: Promise() = default; Promise(Object* parent) : Object(parent) { } Optional> m_pending_or_error; }; }