1 use core::marker;
2 
3 use {Async, Poll};
4 use stream::Stream;
5 
6 /// A stream which is just a shim over an underlying instance of `Iterator`.
7 ///
8 /// This stream will never block and is always ready.
9 #[derive(Debug)]
10 #[must_use = "streams do nothing unless polled"]
11 pub struct IterOk<I, E> {
12     iter: I,
13     _marker: marker::PhantomData<fn() -> E>,
14 }
15 
16 /// Converts an `Iterator` into a `Stream` which is always ready
17 /// to yield the next value.
18 ///
19 /// Iterators in Rust don't express the ability to block, so this adapter
20 /// simply always calls `iter.next()` and returns that.
21 ///
22 /// ```rust
23 /// use futures::*;
24 ///
25 /// let mut stream = stream::iter_ok::<_, ()>(vec![17, 19]);
26 /// assert_eq!(Ok(Async::Ready(Some(17))), stream.poll());
27 /// assert_eq!(Ok(Async::Ready(Some(19))), stream.poll());
28 /// assert_eq!(Ok(Async::Ready(None)), stream.poll());
29 /// ```
iter_ok<I, E>(i: I) -> IterOk<I::IntoIter, E> where I: IntoIterator,30 pub fn iter_ok<I, E>(i: I) -> IterOk<I::IntoIter, E>
31     where I: IntoIterator,
32 {
33     IterOk {
34         iter: i.into_iter(),
35         _marker: marker::PhantomData,
36     }
37 }
38 
39 impl<I, E> Stream for IterOk<I, E>
40     where I: Iterator,
41 {
42     type Item = I::Item;
43     type Error = E;
44 
poll(&mut self) -> Poll<Option<I::Item>, E>45     fn poll(&mut self) -> Poll<Option<I::Item>, E> {
46         Ok(Async::Ready(self.iter.next()))
47     }
48 }
49