wip
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}