#include #include #include #include namespace { void yield_handler(EV_P_ ev_idle* raw_idler, int) { /* Acquire responsibility. */ auto idler = std::unique_ptr(raw_idler); ev_idle_stop(EV_A_ idler.get()); auto ppass = std::unique_ptr>( (std::function*) idler->data ); /* Move off the pass function. */ auto pass = std::move(*ppass); /* Release resources. */ idler = nullptr; ppass = nullptr; pass(); } } namespace Ev { Io yield() { return Io([]( std::function pass , std::function fail ) { auto ppass = Util::make_unique>( std::move(pass) ); auto idler = Util::make_unique(); ev_idle_init(idler.get(), &yield_handler); /* Release responsibility to C code. */ idler->data = ppass.release(); ev_idle_start(EV_DEFAULT_ idler.release()); }); } Io yield(std::size_t num_yields) { if (num_yields == 0) return Ev::lift(); return yield().then([num_yields]() { return yield(num_yields - 1); }); } }