use super::assert_future; use core::pin::Pin; use futures_core::future::{FusedFuture, Future}; use futures_core::task::{Context, Poll}; /// Future for the [`ready`](ready()) function. #[derive(Debug, Clone)] #[must_use = "futures do nothing unless you `.await` or poll them"] pub struct Ready(Option); impl Ready { /// Unwraps the value from this immediately ready future. #[inline] pub fn into_inner(mut self) -> T { self.0.take().unwrap() } } impl Unpin for Ready {} impl FusedFuture for Ready { fn is_terminated(&self) -> bool { self.0.is_none() } } impl Future for Ready { type Output = T; #[inline] fn poll(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll { Poll::Ready(self.0.take().expect("Ready polled after completion")) } } /// Creates a future that is immediately ready with a value. /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::future; /// /// let a = future::ready(1); /// assert_eq!(a.await, 1); /// # }); /// ``` pub fn ready(t: T) -> Ready { assert_future::(Ready(Some(t))) } /// Create a future that is immediately ready with a success value. /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::future; /// /// let a = future::ok::(1); /// assert_eq!(a.await, Ok(1)); /// # }); /// ``` pub fn ok(t: T) -> Ready> { Ready(Some(Ok(t))) } /// Create a future that is immediately ready with an error value. /// /// # Examples /// /// ``` /// # futures::executor::block_on(async { /// use futures::future; /// /// let a = future::err::(1); /// assert_eq!(a.await, Err(1)); /// # }); /// ``` pub fn err(err: E) -> Ready> { Ready(Some(Err(err))) }