// TJP COPYRIGHT HEADER #pragma once #include "Future.h" #include "./custom/Future.hpp" #include namespace tjp { namespace core { template Promise &promise_of(Promise &p, F &&f) { p.consume(f); return p; } template auto future_of(F &&f) { using R_Ref = decltype(f()); using R = std::remove_reference_t; Promise promise; promise.consume(f); return promise.get_future(); } template auto future_of(F &&f, Args && ... args) { using R_Ref = decltype(f(std::forward(args)...)); using R = std::remove_reference_t; Promise promise; promise.consume(f, std::forward(args)...); return promise.get_future(); } template auto future_of_value(T &&t) { using T_ = std::remove_reference_t; Promise promise; promise.set_value(std::forward(t)); return promise.get_future(); } template Future future_of_value(const T &t) { Promise promise; promise.set_value(t); return promise.get_future(); } inline Future future_of_value() { Promise promise; promise.set_value(); return promise.get_future(); } template Future future_of_exception(E &&e) { Promise promise; promise.set_exception(std::forward(e)); return promise.get_future(); } template Future future_of_exception(const E &e) { return future_of_exception(E(e)); } template auto future_with(F &&f) { using R_Ref = decltype(f()); using R = std::remove_reference_t; if constexpr (is_future::value) { using RV = typename R::value_type; try { return f(); } CORE_FUTURE_CATCH_BEGIN(e) { return future_of_exception(e); } CORE_FUTURE_CATCH_END } else { return future_of(f); } } template auto future_with(F &&f, Args && ...args) { using R_Ref = decltype(f(std::forward(args)...)); using R = std::remove_reference_t; if constexpr (is_future::value) { using RV = typename R::value_type; try { return f(std::forward(args)...); } CORE_FUTURE_CATCH_BEGIN(e) { return future_of_exception(e); } CORE_FUTURE_CATCH_END } else { return future_of(f, std::forward(args)...); } } template struct AsFuture_ { T v; template operator Future() { return future_of_value(std::move(v)); } }; template<> struct AsFuture_ { template operator Future() { return future_of_value(); } } ; template AsFuture_ as_future(T &&t) { return AsFuture_> { std::forward(t) }; } inline AsFuture_ as_future() { return AsFuture_ { }; } template struct AsFutureException_ { T v; template operator Future() { return future_of_exception(std::move(v)); } }; template AsFutureException_ as_future_exception(T &&t) { return AsFutureException_> { std::forward(t) }; } //template //auto future_with(F f) -> decltype(f()) { // using R = typename decltype(f())::value_type; // try { // return f(); // } // catch (Exception &e) { // return future_of_exception(copy_of(e)); // } //} //template::value, R>::type*> //auto with(std::function &&f) { // return f; //} // } // namespace } // namespace