in Source/Shared/arcana/threading/task.h [266:289]
inline auto make_task(SchedulerT& scheduler, cancellation& token, CallableT&& callable)
-> typename internal::task_factory<
typename internal::callable_traits<CallableT, void>::error_propagation_type,
typename internal::callable_traits<CallableT, void>::expected_return_type::value_type>::task_t
{
using traits = internal::callable_traits<CallableT, void>;
using wrapper = internal::input_output_wrapper<void, typename traits::error_propagation_type, false>;
auto factory{ internal::make_task_factory(
internal::make_work_payload<typename traits::expected_return_type::value_type, typename traits::error_propagation_type>(
[callable = wrapper::wrap_callable(std::forward<CallableT>(callable), token)]
(internal::base_task_payload*) mutable noexcept
{
return callable(basic_expected<void, typename traits::error_propagation_type>::make_valid());
})
) };
scheduler([to_run = std::move(factory.to_run)]
{
to_run.m_payload->run(nullptr);
});
return factory.to_return;
}