use std::future::Future;
use std::pin::pin;
use std::ptr::null;
use std::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};
pub fn block_on<T>(future: impl Future<Output = T>) -> T {
let mut future = pin!(future);
let waker = noop();
let mut context = Context::from_waker(&waker);
loop {
match future.as_mut().poll(&mut context) {
Poll::Pending => continue,
Poll::Ready(result) => break result,
}
}
}
fn noop() -> Waker {
const VTABLE: RawWakerVTable = RawWakerVTable::new(clone, wake, wake_by_ref, drop);
const RAW: RawWaker = RawWaker::new(null(), &VTABLE);
unsafe fn clone(_: *const ()) -> RawWaker {
RAW
}
unsafe fn wake(_: *const ()) {}
unsafe fn wake_by_ref(_: *const ()) {}
unsafe fn drop(_: *const ()) {}
unsafe { Waker::from_raw(RAW) }
}