diff options
Diffstat (limited to 'third_party/rust/futures-0.1.31/src/stream/iter_ok.rs')
-rw-r--r-- | third_party/rust/futures-0.1.31/src/stream/iter_ok.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/third_party/rust/futures-0.1.31/src/stream/iter_ok.rs b/third_party/rust/futures-0.1.31/src/stream/iter_ok.rs new file mode 100644 index 0000000000..9c8d871399 --- /dev/null +++ b/third_party/rust/futures-0.1.31/src/stream/iter_ok.rs @@ -0,0 +1,48 @@ +use core::marker; + +use {Async, Poll}; +use stream::Stream; + +/// A stream which is just a shim over an underlying instance of `Iterator`. +/// +/// This stream will never block and is always ready. +#[derive(Debug)] +#[must_use = "streams do nothing unless polled"] +pub struct IterOk<I, E> { + iter: I, + _marker: marker::PhantomData<fn() -> E>, +} + +/// Converts an `Iterator` into a `Stream` which is always ready +/// to yield the next value. +/// +/// Iterators in Rust don't express the ability to block, so this adapter +/// simply always calls `iter.next()` and returns that. +/// +/// ```rust +/// use futures::*; +/// +/// let mut stream = stream::iter_ok::<_, ()>(vec![17, 19]); +/// assert_eq!(Ok(Async::Ready(Some(17))), stream.poll()); +/// assert_eq!(Ok(Async::Ready(Some(19))), stream.poll()); +/// assert_eq!(Ok(Async::Ready(None)), stream.poll()); +/// ``` +pub fn iter_ok<I, E>(i: I) -> IterOk<I::IntoIter, E> + where I: IntoIterator, +{ + IterOk { + iter: i.into_iter(), + _marker: marker::PhantomData, + } +} + +impl<I, E> Stream for IterOk<I, E> + where I: Iterator, +{ + type Item = I::Item; + type Error = E; + + fn poll(&mut self) -> Poll<Option<I::Item>, E> { + Ok(Async::Ready(self.iter.next())) + } +} |