diff options
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/future/flatten.rs')
-rw-r--r-- | third_party/rust/futures-0.1.31/src/future/flatten.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/future/flatten.rs b/third_party/rust/futures-0.1.31/src/future/flatten.rs new file mode 100644 index 0000000000..bfe286975c --- /dev/null +++ b/third_party/rust/futures-0.1.31/src/future/flatten.rs @@ -0,0 +1,49 @@ +use {Future, IntoFuture, Poll}; +use core::fmt; +use super::chain::Chain; + +/// Future for the `flatten` combinator, flattening a future-of-a-future to get just +/// the result of the final future. +/// +/// This is created by the `Future::flatten` method. +#[must_use = "futures do nothing unless polled"] +pub struct Flatten<A> where A: Future, A::Item: IntoFuture { + state: Chain<A, <A::Item as IntoFuture>::Future, ()>, +} + +impl<A> fmt::Debug for Flatten<A> + where A: Future + fmt::Debug, + A::Item: IntoFuture, + <<A as IntoFuture>::Item as IntoFuture>::Future: fmt::Debug, +{ + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fmt.debug_struct("Flatten") + .field("state", &self.state) + .finish() + } +} + +pub fn new<A>(future: A) -> Flatten<A> + where A: Future, + A::Item: IntoFuture, +{ + Flatten { + state: Chain::new(future, ()), + } +} + +impl<A> Future for Flatten<A> + where A: Future, + A::Item: IntoFuture, + <<A as Future>::Item as IntoFuture>::Error: From<<A as Future>::Error> +{ + type Item = <<A as Future>::Item as IntoFuture>::Item; + type Error = <<A as Future>::Item as IntoFuture>::Error; + + fn poll(&mut self) -> Poll<Self::Item, Self::Error> { + self.state.poll(|a, ()| { + let future = a?.into_future(); + Ok(Err(future)) + }) + } +} |