// License: Modified MIT (NON-AI) // See the LICENSE file in the root directory for license information. // Copyright 2026 Timothy Prepscius #pragma once #include #include #include #include namespace tjp::core { namespace futures::v2 { struct FutureErase { StrongPtr> future; FutureErase() {} template FutureErase(Future &&future_) { set(std::move(future_)); } ~FutureErase() { clear(); } template void set(Future &&future_) { strong_emplace(future); *future = future_.then([future_ = weak(future)](auto &&f){ if (auto future = strong(future_)) (*future) = {}; }); if (future->is_set()) future = {}; } template void operator =(Future &&future_) { return set(std::move(future_)); } void clear() { future.reset(); } bool has_value () const { return future && future->valid(); } bool empty() const { return !has_value(); } Future get_future() { auto future_ = future; return future_ ? *future_ : future_of_value(); } } ; } // namespace using FutureErase = futures::v2::FutureErase; } // namespace