serenity/Userland/Libraries/LibCore/Promise.h
MacDue 8a5d2be617 Everywhere: Remove unnecessary mutable attributes from lambdas
These lambdas were marked mutable as they captured a Ptr wrapper
class by value, which then only returned const-qualified references
to the value they point from the previous const pointer operators.

Nothing is actually mutating in the lambdas state here, and now
that the Ptr operators don't add extra const qualifiers these
can be removed.
2022-11-19 14:37:31 +00:00

58 lines
1.2 KiB
C++

/*
* Copyright (c) 2021, Kyle Pereira <hey@xylepereira.me>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibCore/EventLoop.h>
#include <LibCore/Object.h>
namespace Core {
template<typename Result>
class Promise : public Object {
C_OBJECT(Promise);
public:
Function<void(Result&)> on_resolved;
void resolve(Result&& result)
{
m_pending = move(result);
if (on_resolved)
on_resolved(m_pending.value());
}
bool is_resolved()
{
return m_pending.has_value();
};
Result await()
{
while (!is_resolved()) {
Core::EventLoop::current().pump();
}
return m_pending.release_value();
}
// Converts a Promise<A> to a Promise<B> using a function func: A -> B
template<typename T>
RefPtr<Promise<T>> map(T func(Result&))
{
RefPtr<Promise<T>> new_promise = Promise<T>::construct();
on_resolved = [new_promise, func](Result& result) {
auto t = func(result);
new_promise->resolve(move(t));
};
return new_promise;
}
private:
Promise() = default;
Optional<Result> m_pending;
};
}