| 1 | use core::pin::Pin; |
| 2 | use futures_core::future::Future; |
| 3 | use futures_core::task::{Context, Poll}; |
| 4 | |
| 5 | /// A macro which yields to the event loop once. |
| 6 | /// |
| 7 | /// This is equivalent to returning [`Poll::Pending`](futures_core::task::Poll) |
| 8 | /// from a [`Future::poll`](futures_core::future::Future::poll) implementation. |
| 9 | /// Similarly, when using this macro, it must be ensured that [`wake`](std::task::Waker::wake) |
| 10 | /// is called somewhere when further progress can be made. |
| 11 | /// |
| 12 | /// This macro is only usable inside of async functions, closures, and blocks. |
| 13 | /// It is also gated behind the `async-await` feature of this library, which is |
| 14 | /// activated by default. |
| 15 | #[macro_export ] |
| 16 | macro_rules! pending { |
| 17 | () => { |
| 18 | $crate::__private::async_await::pending_once().await |
| 19 | }; |
| 20 | } |
| 21 | |
| 22 | #[doc (hidden)] |
| 23 | pub fn pending_once() -> PendingOnce { |
| 24 | PendingOnce { is_ready: false } |
| 25 | } |
| 26 | |
| 27 | #[allow (missing_debug_implementations)] |
| 28 | #[doc (hidden)] |
| 29 | pub struct PendingOnce { |
| 30 | is_ready: bool, |
| 31 | } |
| 32 | |
| 33 | impl Future for PendingOnce { |
| 34 | type Output = (); |
| 35 | fn poll(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Self::Output> { |
| 36 | if self.is_ready { |
| 37 | Poll::Ready(()) |
| 38 | } else { |
| 39 | self.is_ready = true; |
| 40 | Poll::Pending |
| 41 | } |
| 42 | } |
| 43 | } |
| 44 | |