in Source/Shared/arcana/threading/task.h [94:120]
auto then(SchedulerT& scheduler, cancellation& token, CallableT&& callable)
{
using traits = internal::callable_traits<CallableT, result_type>;
using wrapper = internal::input_output_wrapper<result_type, error_type, traits::handles_expected::value>;
static_assert(error_priority<error_type>::value <= error_priority<typename traits::error_propagation_type>::value,
"The error of a parent task needs to be convertible to the error of a child task.");
static_assert(std::is_same_v<typename expected_error_or<typename traits::input_type, error_type>::type, error_type>,
"Continuation expected input parameter needs to use the same error type as the parent task");
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* self) mutable noexcept
{
return callable(*static_cast<payload_t*>(self)->Result);
})
) };
m_payload->create_continuation([&scheduler](auto&& c)
{
scheduler(std::forward<decltype(c)>(c));
}, m_payload, std::move(factory.to_run.m_payload));
return factory.to_return;
}