1#![no_std]
2extern crate alloc;
3
4mod local_pool_new;
5mod local_pool_old;
6pub(crate) mod waker;
7mod local_pool_busy;
8
9pub use crate::local_pool_old::*;
10pub use crate::local_pool_new::LocalPool as NewLocalPool;
11pub use crate::local_pool_new::Spawner as NewSpawner;
12pub use crate::local_pool_busy::Spawner as BusySpawner;
13pub use crate::local_pool_busy::LocalPool as BusyLocalPool;
14
15use core::future::{Future};
16use core::task::{Poll, Context};
17use crate::waker::{AlwaysWake, waker_ref};
18
19pub fn poll_fn<T, F: FnOnce(&mut Context<'_>) -> T>(f: F) -> T {
20 let waker = waker_ref(&AlwaysWake::INSTANCE);
21 let mut cx = Context::from_waker(&waker);
22 f(&mut cx)
23}
24
25pub fn block_fn<T, F: FnMut(&mut Context<'_>) -> Poll<T>>(mut f: F) -> T {
26 let waker = waker_ref(&AlwaysWake::INSTANCE);
27 let mut cx = Context::from_waker(&waker);
28 loop {
29 if let Poll::Ready(t) = f(&mut cx) {
30 return t;
31 }
32 }
33}
34
35pub fn poll_on<T, Fut: Future<Output = T>>(f: Fut) -> Poll<Fut::Output> {
36 futures::pin_mut!(f);
37 poll_fn(|cx| f.as_mut().poll(cx))
38}
39
40
41pub fn block_on<T, Fut: Future<Output = T>>(f: Fut) -> Fut::Output {
42 futures::pin_mut!(f);
43 block_fn(|cx| f.as_mut().poll(cx))
44}