1use core::{
3 future::Future,
4 pin::Pin,
5 task::{Context, Poll, RawWaker, RawWakerVTable, Waker},
6};
7
8pub fn now_or_never<F: Future>(mut future: F) -> Option<F::Output> {
13 let noop_waker = noop_waker();
14 let mut cx = Context::from_waker(&noop_waker);
15
16 let future = unsafe { Pin::new_unchecked(&mut future) };
18
19 match future.poll(&mut cx) {
20 Poll::Ready(x) => Some(x),
21 _ => None,
22 }
23}
24
25pub fn check_ready<F: Future + Unpin>(future: &mut F) -> Option<F::Output> {
28 let noop_waker = noop_waker();
29 let mut cx = Context::from_waker(&noop_waker);
30
31 let future = Pin::new(future);
32
33 match future.poll(&mut cx) {
34 Poll::Ready(x) => Some(x),
35 _ => None,
36 }
37}
38
39fn noop_clone(_data: *const ()) -> RawWaker {
40 noop_raw_waker()
41}
42fn noop(_data: *const ()) {}
43
44const NOOP_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(noop_clone, noop, noop, noop);
45
46fn noop_raw_waker() -> RawWaker {
47 RawWaker::new(core::ptr::null(), &NOOP_WAKER_VTABLE)
48}
49
50fn noop_waker() -> Waker {
51 unsafe { Waker::from_raw(noop_raw_waker()) }
54}