diff options
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/future/and_then.rs')
-rw-r--r-- | third_party/rust/futures-0.1.31/src/future/and_then.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/future/and_then.rs b/third_party/rust/futures-0.1.31/src/future/and_then.rs new file mode 100644 index 0000000000..2e5b6aa16e --- /dev/null +++ b/third_party/rust/futures-0.1.31/src/future/and_then.rs @@ -0,0 +1,38 @@ +use {Future, IntoFuture, Poll}; +use super::chain::Chain; + +/// Future for the `and_then` combinator, chaining a computation onto the end of +/// another future which completes successfully. +/// +/// This is created by the `Future::and_then` method. +#[derive(Debug)] +#[must_use = "futures do nothing unless polled"] +pub struct AndThen<A, B, F> where A: Future, B: IntoFuture { + state: Chain<A, B::Future, F>, +} + +pub fn new<A, B, F>(future: A, f: F) -> AndThen<A, B, F> + where A: Future, + B: IntoFuture, +{ + AndThen { + state: Chain::new(future, f), + } +} + +impl<A, B, F> Future for AndThen<A, B, F> + where A: Future, + B: IntoFuture<Error=A::Error>, + F: FnOnce(A::Item) -> B, +{ + type Item = B::Item; + type Error = B::Error; + + fn poll(&mut self) -> Poll<B::Item, B::Error> { + self.state.poll(|result, f| { + result.map(|e| { + Err(f(e).into_future()) + }) + }) + } +} |