use super::Reactor;
use core::future::Future;
use core::pin::pin;
use core::ptr;
use core::task::Waker;
use core::task::{Context, Poll, RawWaker, RawWakerVTable};
pub fn block_on<F, Fut>(f: F) -> Fut::Output
where
F: FnOnce(Reactor) -> Fut,
Fut: Future,
{
let reactor = Reactor::new();
let fut = (f)(reactor.clone());
let mut fut = pin!(fut);
let waker = noop_waker();
let mut cx = Context::from_waker(&waker);
loop {
match fut.as_mut().poll(&mut cx) {
Poll::Ready(res) => return res,
Poll::Pending => reactor.block_until(),
}
}
}
fn noop_waker() -> Waker {
const VTABLE: RawWakerVTable = RawWakerVTable::new(
|_| RAW,
|_| {},
|_| {},
|_| {},
);
const RAW: RawWaker = RawWaker::new(ptr::null(), &VTABLE);
unsafe { Waker::from_raw(RAW) }
}