/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: JobFrom.hpp Date: 2021-11-1 Author: Reece ***/ #pragma once namespace Aurora::Async { template static inline FJob JobFromPairConsumer(const /*AuConsumer */ Callable_t&onSuccess) { FJob ret; ret.onSuccess = [=](const Info_t &in, const Result_t &a) { onSuccess(in, a); }; return ret; } template static inline FJob JobFromResultConsumer(/*AuConsumer */ Callable_t&&onSuccess) { FJob ret; ret.onSuccess = [=](const Info_t &in, const Result_t &a) { onSuccess(a); }; return ret; } template FJob, Out_t> JobFromTupleConsumer(/*AuConsumer */ Callable_t &&onSuccess) { FJob, Out_t> ret; ret.onSuccess = [=](const AuTuple &in, const Out_t &a) { AuTupleApply(onSuccess, AuTupleCat(in, AuMakeTuple(a))); }; return ret; } template FJob, Out_t> JobFromTupleConsumerEx(/*AuConsumer */ Callable_t &&onSuccess, FailureCallable_t &&onFailure) { FJob, Out_t> ret; ret.onSuccess = [=](const AuTuple &in, const Out_t &a) { AuTupleApply(onSuccess, AuTupleCat(in, AuMakeTuple(a))); }; ret.onFailure = [=](const AuTuple &in) { AuTupleApply(onFailure, in); }; return ret; } template static inline FJob JobFromPairConsumerEx(const AuConsumer &onSuccess, const AuConsumer &onFailure) { FJob ret; ret.onSuccess = [=](const Info_t &in, const Result_t &a) { onSuccess(in, a); }; ret.onFailure = [=](const Info_t &a) { onFailure(a); }; return ret; } template static inline FJob JobFromConsumer(const AuConsumer &onSuccess, const AuVoidFunc &onFailure) { FJob ret; ret.onSuccess = [=](const Info_t &in, const Result_t &a) { onSuccess(a); }; ret.onFailure = [=](const Info_t &a) { onFailure(); }; return ret; } template static inline FJob JobFromDerivedJob(const FJob &reference) { FJob ret; ret.onSuccess = [=](const Info_t &in, const Result_t &a) { if (reference.onSuccess) { reference.onSuccess(in, a); } }; ret.onFailure = [=](const Info_t &a) { if (reference.onFailure) { reference.onFailure(a); } }; return ret; } template static inline FJob, ReturnValue_t> JobFromTupleClazz(const AuConsumer &onSuccess) { FJob, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple &in, const ReturnValue_t &out) { onSuccess(AuGet<0>(in), out); }; return ret; } template static inline FJob, ReturnValue_t> JobFromTupleClazzEx(const AuConsumer &onSuccess, const AuConsumer &onFailure) { FJob, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple &in, const ReturnValue_t &out) { onSuccess(AuGet<0>(in), out); }; ret.onFailure = [=](const AuTuple &in) { onFailure(AuGet<0>(in)); }; return ret; } #if 0 template static inline FJob, Args...>, ReturnValue_t> JobFromTupleClazz(const AuConsumer &onSuccess) { FJob, Args...>, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple, Args...> &in, const ReturnValue_t &out) { onSuccess(out); }; return ret; } template static inline FJob, Args...>, ReturnValue_t> JobFromTupleClazz(const AuConsumer &onSuccess) { FJob, Args...>, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple, Args...> &in, const ReturnValue_t &out) { AuTupleApply(onSuccess, AuTupleCat(AuTuplePopFront(in), AuMakeTuple(out))); }; return ret; } #endif template static inline FJob, ReturnValue_t> JobFromTupleResultConsumer(const AuConsumer &onSuccess) { FJob, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple &in, const ReturnValue_t &out) { onSuccess(out); }; return ret; } template static inline FJob, ReturnValue_t> JobFromTuple(const AuConsumer &onSuccess) { FJob, ReturnValue_t> ret; ret.onSuccess = [=](const AuTuple &in, const ReturnValue_t &out) { AuTupleApply(onSuccess, AuTupleCat(in, AuMakeTuple(out))); }; return ret; } }