Add core::future::{pending,ready}
This commit is contained in:
parent
af89eb5e5b
commit
029515d916
|
@ -11,9 +11,17 @@ use crate::{
|
|||
};
|
||||
|
||||
mod future;
|
||||
mod pending;
|
||||
mod ready;
|
||||
|
||||
#[stable(feature = "futures_api", since = "1.36.0")]
|
||||
pub use self::future::Future;
|
||||
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
pub use pending::{pending, Pending};
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
pub use ready::{ready, Ready};
|
||||
|
||||
/// This type is needed because:
|
||||
///
|
||||
/// a) Generators cannot implement `for<'a, 'b> Generator<&'a mut Context<'b>>`, so we need to pass
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
use crate::future::Future;
|
||||
use crate::marker;
|
||||
use crate::pin::Pin;
|
||||
use crate::task::{Context, Poll};
|
||||
|
||||
/// Creates a future which never resolves, representing a computation that never
|
||||
/// finishes.
|
||||
///
|
||||
/// This `struct` is created by the [`pending`] function. See its
|
||||
/// documentation for more.
|
||||
///
|
||||
/// [`pending`]: fn.pending.html
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
#[derive(Debug)]
|
||||
#[must_use = "futures do nothing unless you `.await` or poll them"]
|
||||
pub struct Pending<T> {
|
||||
_data: marker::PhantomData<T>,
|
||||
}
|
||||
|
||||
/// Creates a future which never resolves, representing a computation that never
|
||||
/// finishes.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```no_run
|
||||
/// #![feature(future_readiness_fns)]
|
||||
/// use core::future;
|
||||
///
|
||||
/// # async fn run() {
|
||||
/// let future = future::pending();
|
||||
/// let () = future.await;
|
||||
/// unreachable!();
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
pub fn pending<T>() -> Pending<T> {
|
||||
Pending { _data: marker::PhantomData }
|
||||
}
|
||||
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
impl<T> Future for Pending<T> {
|
||||
type Output = T;
|
||||
|
||||
fn poll(self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<T> {
|
||||
Poll::Pending
|
||||
}
|
||||
}
|
||||
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
impl<T> Unpin for Pending<T> {}
|
||||
|
||||
#[unstable(feature = "future_readiness_fns", issue = "70921")]
|
||||
impl<T> Clone for Pending<T> {
|
||||
fn clone(&self) -> Self {
|
||||
pending()
|
||||
}
|
||||
}
|
|
@ -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))
|
||||
}
|
Loading…
Reference in New Issue