type operator()(future<T> const& x) const { if (auto&& state = x.get_state(use_private_interface)) return state->template then<future<void>>(std::bind([](){})); else return make_ready_future(); }
void apply(future<void> f) const { if (f.ready()) return; task_context* ctx = current_task_context::get(); if (!ctx) { f.wait(); return; } auto&& resume_task = [=]() { ctx->resume(); }; auto s = f.get_state(detail::use_private_interface); s->continue_with([&]() { s->await_queue()->push_front([=]() { resume_task(); }); }); ctx->yield(); }