summaryrefslogtreecommitdiffstats
path: root/third_party/rust/futures-0.1.31/src/future/flatten.rs
diff options
context:
space:
mode:
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.rs49
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))
+ })
+ }
+}