at main 1.2 kB view raw
1use std::{pin::Pin, ptr::NonNull, task::Poll}; 2 3use futures_core::{Future, Wake}; 4use lifetime_guard::{atomic_guard::AtomicValueGuard, guard::ValueGuard}; 5 6pub mod block_on; 7pub mod maybe_done; 8 9pub type WakePtr = Option<NonNull<dyn Wake>>; 10pub type LocalWaker = ValueGuard<WakePtr>; 11pub type AtomicWaker = AtomicValueGuard<WakePtr>; 12 13pub(crate) fn assert_future<T, F>(future: F) -> F 14where 15 F: Future<LocalWaker, Output = T>, 16{ 17 future 18} 19 20pub struct PollFn<F, T>(F) 21where 22 F: FnMut(&LocalWaker) -> Poll<T>; 23 24impl<F, T> futures_core::Future<LocalWaker> for PollFn<F, T> 25where 26 F: FnMut(&LocalWaker) -> Poll<T>, 27{ 28 type Output = T; 29 30 fn poll( 31 self: Pin<&mut Self>, 32 waker: Pin<&LocalWaker>, 33 ) -> Poll<Self::Output> { 34 (unsafe { &mut self.get_unchecked_mut().0 })(&waker) 35 } 36} 37 38pub fn poll_fn<F, T>(f: F) -> impl futures_core::Future<LocalWaker, Output = T> 39where 40 F: FnMut(&LocalWaker) -> Poll<T>, 41{ 42 PollFn(f) 43} 44 45pub struct DummyWaker; 46 47impl Wake for DummyWaker { 48 fn wake(&self) { 49 dbg!("awake!"); 50 } 51} 52 53pub fn dummy_guard() -> ValueGuard<WakePtr> { 54 ValueGuard::new(NonNull::new(&mut DummyWaker as *mut dyn Wake)) 55}