#pragma once #include #include #include "../memory/Memory.hpp" // TODO: move into hyprutils template class CPromise; template class CPromiseResult; template class CPromiseResolver { public: CPromiseResolver(const CPromiseResolver&) = delete; CPromiseResolver(CPromiseResolver&&) = delete; CPromiseResolver& operator=(const CPromiseResolver&) = delete; CPromiseResolver& operator=(CPromiseResolver&&) = delete; void resolve(T value) { if (m_promise->m_result) return; m_promise->m_result = CPromiseResult::result(value); if (!m_promise->m_then) return; m_promise->m_then(m_promise->m_result); } void reject(const std::string& reason) { if (m_promise->m_result) return; m_promise->m_result = CPromiseResult::err(reason); if (!m_promise->m_then) return; m_promise->m_then(m_promise->m_result); } private: CPromiseResolver(SP> promise) : m_promise(promise) {} SP> m_promise; friend class CPromise; }; template class CPromiseResult { public: bool hasError() { return m_hasError; } T result() { return m_result; } std::string error() { return m_error; } private: static SP> result(T result) { auto p = SP>(new CPromiseResult()); p->m_result = result; return p; } static SP> err(std::string reason) { auto p = SP>(new CPromiseResult()); p->m_error = reason; p->m_hasError = true; return p; } T m_result = {}; std::string m_error = {}; bool m_hasError = false; friend class CPromiseResolver; }; template class CPromise { public: CPromise(const CPromise&) = delete; CPromise(CPromise&&) = delete; CPromise& operator=(const CPromise&) = delete; CPromise& operator=(CPromise&&) = delete; static SP make(const std::function>)>& fn) { auto sp = SP>(new CPromise()); fn(SP>(new CPromiseResolver(sp))); return sp; } void then(std::function>)>&& fn) { m_then = std::move(fn); if (m_result) m_then(m_result); } private: CPromise() = default; const std::function>)> m_fn; std::function>)> m_then; SP> m_result; friend class CPromiseResult; friend class CPromiseResolver; };