summaryrefslogtreecommitdiffstats
path: root/third_party/rust/futures-0.1.31/src/resultstream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/resultstream.rs')
-rw-r--r--third_party/rust/futures-0.1.31/src/resultstream.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/resultstream.rs b/third_party/rust/futures-0.1.31/src/resultstream.rs
new file mode 100644
index 0000000000..23a99819bd
--- /dev/null
+++ b/third_party/rust/futures-0.1.31/src/resultstream.rs
@@ -0,0 +1,46 @@
+// This should really be in the stream module,
+// but `pub(crate)` isn't available until Rust 1.18,
+// and pre-1.18 there isn't a really good way to have a sub-module
+// available to the crate, but not without it.
+use core::marker::PhantomData;
+
+use {Poll, Async};
+use stream::Stream;
+
+
+/// A stream combinator used to convert a `Stream<Item=T,Error=E>`
+/// to a `Stream<Item=Result<T,E>>`.
+///
+/// A poll on this stream will never return an `Err`. As such the
+/// actual error type is parameterized, so it can match whatever error
+/// type is needed.
+///
+/// This structure is produced by the `Stream::results` method.
+#[derive(Debug)]
+#[must_use = "streams do nothing unless polled"]
+pub struct Results<S: Stream, E> {
+ inner: S,
+ phantom: PhantomData<E>
+}
+
+pub fn new<S, E>(s: S) -> Results<S, E> where S: Stream {
+ Results {
+ inner: s,
+ phantom: PhantomData
+ }
+}
+
+impl<S: Stream, E> Stream for Results<S, E> {
+ type Item = Result<S::Item, S::Error>;
+ type Error = E;
+
+ fn poll(&mut self) -> Poll<Option<Result<S::Item, S::Error>>, E> {
+ match self.inner.poll() {
+ Ok(Async::Ready(Some(item))) => Ok(Async::Ready(Some(Ok(item)))),
+ Err(e) => Ok(Async::Ready(Some(Err(e)))),
+ Ok(Async::Ready(None)) => Ok(Async::Ready(None)),
+ Ok(Async::NotReady) => Ok(Async::NotReady)
+ }
+ }
+}
+