use super::assert_stream; use core::pin::Pin; use futures_core::stream::Stream; use futures_core::task::{Context, Poll}; /// Stream for the [`iter`] function. #[derive(Debug, Clone)] #[must_use = "streams do nothing unless polled"] pub struct Iter { iter: I, } impl Unpin for Iter {} /// 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. /// /// ``` /// # futures::executor::block_on(async { /// use futures::stream::{self, StreamExt}; /// /// let stream = stream::iter(vec![17, 19]); /// assert_eq!(vec![17, 19], stream.collect::>().await); /// # }); /// ``` pub fn iter(i: I) -> Iter where I: IntoIterator, { assert_stream::(Iter { iter: i.into_iter() }) } impl Stream for Iter where I: Iterator, { type Item = I::Item; fn poll_next(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll> { Poll::Ready(self.iter.next()) } fn size_hint(&self) -> (usize, Option) { self.iter.size_hint() } }