/* * Copyright (c) 2024, Ali Mohammad Pur * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace AK { class GenericAwaiter { AK_MAKE_NONMOVABLE(GenericAwaiter); AK_MAKE_NONCOPYABLE(GenericAwaiter); public: GenericAwaiter(Function)>&& fn) { fn([this] { ready(); }); } bool await_ready() const { return false; } void await_suspend(std::coroutine_handle<> handle) { m_handle = handle; } ErrorOr await_resume() { m_handle = {}; return {}; } private: void ready() { if (m_handle) m_handle.resume(); } std::coroutine_handle<> m_handle; }; } #ifdef USING_AK_GLOBALLY using AK::GenericAwaiter; #endif