diff options
Diffstat (limited to 'library/core/src/future/ready.rs')
| -rw-r--r-- | library/core/src/future/ready.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/library/core/src/future/ready.rs b/library/core/src/future/ready.rs new file mode 100644 index 00000000000..31b39d7fb6c --- /dev/null +++ b/library/core/src/future/ready.rs @@ -0,0 +1,45 @@ +use crate::future::Future; +use crate::pin::Pin; +use crate::task::{Context, Poll}; + +/// Creates a future that is immediately ready with a value. +/// +/// This `struct` is created by the [`ready`] function. See its +/// documentation for more. +/// +/// [`ready`]: fn.ready.html +#[unstable(feature = "future_readiness_fns", issue = "70921")] +#[derive(Debug, Clone)] +#[must_use = "futures do nothing unless you `.await` or poll them"] +pub struct Ready<T>(Option<T>); + +#[unstable(feature = "future_readiness_fns", issue = "70921")] +impl<T> Unpin for Ready<T> {} + +#[unstable(feature = "future_readiness_fns", issue = "70921")] +impl<T> Future for Ready<T> { + type Output = T; + + #[inline] + fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<T> { + Poll::Ready(self.0.take().expect("Ready polled after completion")) + } +} + +/// Creates a future that is immediately ready with a value. +/// +/// # Examples +/// +/// ``` +/// #![feature(future_readiness_fns)] +/// use core::future; +/// +/// # async fn run() { +/// let a = future::ready(1); +/// assert_eq!(a.await, 1); +/// # } +/// ``` +#[unstable(feature = "future_readiness_fns", issue = "70921")] +pub fn ready<T>(t: T) -> Ready<T> { + Ready(Some(t)) +} |
