use futures::{Poll, Async};
use futures::stream::Stream;
#[derive(Debug)]
#[must_use = "streams do nothing unless polled"]
pub struct Fuse<S> {
stream: S,
done: bool,
}
impl<S> Fuse<S> {
pub fn new(stream: S) -> Fuse<S> {
Fuse { stream, done: false }
}
}
impl<S: Stream> Stream for Fuse<S> {
type Item = S::Item;
type Error = S::Error;
fn poll(&mut self) -> Poll<Option<S::Item>, S::Error> {
if self.done {
Ok(Async::Ready(None))
} else {
match self.stream.poll() {
res @ Ok(Async::Ready(None)) | res @ Err(_) => {
self.done = true;
res
}
Ok(Async::Ready(Some(x))) => Ok(Async::Ready(Some(x))),
Ok(Async::NotReady) => Ok(Async::NotReady),
}
}
}
}
impl<S> Fuse<S> {
pub fn is_done(&self) -> bool {
self.done
}
}