forked from mirror/async-std
Remove unused macros (#610)
* replace async-macros with internals only Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> * clean up MaybeDone Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> * inline futures_core::ready Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com> * remove big commented blob Signed-off-by: Yoshua Wuyts <yoshuawuyts@gmail.com>split-by-pattern
parent
f06ab9fbc4
commit
a0f3b3b753
@ -0,0 +1,79 @@
|
||||
//! A type that wraps a future to keep track of its completion status.
|
||||
//!
|
||||
//! This implementation was taken from the original `macro_rules` `join/try_join`
|
||||
//! macros in the `futures-preview` crate.
|
||||
|
||||
use std::future::Future;
|
||||
use std::mem;
|
||||
use std::pin::Pin;
|
||||
use std::task::{Context, Poll};
|
||||
|
||||
use futures_core::ready;
|
||||
|
||||
/// A future that may have completed.
|
||||
#[derive(Debug)]
|
||||
pub(crate) enum MaybeDone<Fut: Future> {
|
||||
/// A not-yet-completed future
|
||||
Future(Fut),
|
||||
|
||||
/// The output of the completed future
|
||||
Done(Fut::Output),
|
||||
|
||||
/// The empty variant after the result of a [`MaybeDone`] has been
|
||||
/// taken using the [`take`](MaybeDone::take) method.
|
||||
Gone,
|
||||
}
|
||||
|
||||
impl<Fut: Future> MaybeDone<Fut> {
|
||||
/// Create a new instance of `MaybeDone`.
|
||||
pub(crate) fn new(future: Fut) -> MaybeDone<Fut> {
|
||||
Self::Future(future)
|
||||
}
|
||||
|
||||
/// Returns an [`Option`] containing a reference to the output of the future.
|
||||
/// The output of this method will be [`Some`] if and only if the inner
|
||||
/// future has been completed and [`take`](MaybeDone::take)
|
||||
/// has not yet been called.
|
||||
#[inline]
|
||||
pub(crate) fn output(self: Pin<&Self>) -> Option<&Fut::Output> {
|
||||
let this = self.get_ref();
|
||||
match this {
|
||||
MaybeDone::Done(res) => Some(res),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Attempt to take the output of a `MaybeDone` without driving it
|
||||
/// towards completion.
|
||||
#[inline]
|
||||
pub(crate) fn take(self: Pin<&mut Self>) -> Option<Fut::Output> {
|
||||
unsafe {
|
||||
let this = self.get_unchecked_mut();
|
||||
match this {
|
||||
MaybeDone::Done(_) => {}
|
||||
MaybeDone::Future(_) | MaybeDone::Gone => return None,
|
||||
};
|
||||
if let MaybeDone::Done(output) = mem::replace(this, MaybeDone::Gone) {
|
||||
Some(output)
|
||||
} else {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Fut: Future> Future for MaybeDone<Fut> {
|
||||
type Output = ();
|
||||
|
||||
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
||||
let res = unsafe {
|
||||
match Pin::as_mut(&mut self).get_unchecked_mut() {
|
||||
MaybeDone::Future(a) => ready!(Pin::new_unchecked(a).poll(cx)),
|
||||
MaybeDone::Done(_) => return Poll::Ready(()),
|
||||
MaybeDone::Gone => panic!("MaybeDone polled after value taken"),
|
||||
}
|
||||
};
|
||||
self.set(MaybeDone::Done(res));
|
||||
Poll::Ready(())
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
/// Extracts the successful type of a `Poll<T>`.
|
||||
///
|
||||
/// This macro bakes in propagation of `Pending` signals by returning early.
|
||||
pub use futures_core::ready;
|
Loading…
Reference in New Issue