use {Future, Poll, Async}; /// Future for the `map` combinator, changing the type of a future. /// /// This is created by the `Future::map` method. #[derive(Debug)] #[must_use = "futures do nothing unless polled"] pub struct Map where A: Future { future: A, f: Option, } pub fn new(future: A, f: F) -> Map where A: Future, { Map { future: future, f: Some(f), } } impl Future for Map where A: Future, F: FnOnce(A::Item) -> U, { type Item = U; type Error = A::Error; fn poll(&mut self) -> Poll { let e = match self.future.poll() { Ok(Async::NotReady) => return Ok(Async::NotReady), Ok(Async::Ready(e)) => Ok(e), Err(e) => Err(e), }; e.map(self.f.take().expect("cannot poll Map twice")) .map(Async::Ready) } }