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