/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: TaskFrom.hpp Date: 2021-11-1 Author: Reece ***/ #pragma once namespace Aurora::Async { template FTask TaskFromConsumerRefT(ClazzImpl &&func) { FTask ret; ret.onFrame = [callable = func](const Info_t &in) -> Out_t { if constexpr (std::is_same_v) { callable(in); return {}; } else { return callable(in); } }; return ret; } template FTask, Out_t> TaskFromTupleCallable(Functor &&func) { FTask, Out_t> ret; static_assert(std::is_same_v, std::tuple>); ret.onFrame = [callable = func](const std::tuple &in) -> Out_t { return std::apply(callable, in); }; return ret; } template FTask, Out_t> TaskFromTupleCallableWithOwnerArg(AuFunction &&func, const Owner_t &ownerToPin) { FTask, Out_t> ret; ret.onFrame = [callable = func](const std::tuple &in) -> Out_t { return std::apply(callable, std::tuple_cat(std::make_tuple(ownerToPin), in)); }; return ret; } template Task_t TaskFromTupleCallableWithBindOwner(Functor &&func) { Task_t ret; ret.onFrame = [callable = func](const auto &in) -> ReturnValue_t { return std::apply(callable, AuTuplePopFront(in)); }; return ret; } template Task_t TaskFromTupleCallableWithBindOwner2(Functor func) { Task_t ret; ret.onFrame = [callable = func](const auto &in) -> ReturnValue_t { return std::apply(callable, AuTuplePopFront(in)); }; return ret; } template FTask TaskFromVoidVoid(const AuVoidFunc &func) { FTask ret; ret.onFrame = [callable = func](const Info_t &in) -> Out_t { callable(); return {}; }; return ret; } }