async_std/stream/
from_iter.rs

1use core::pin::Pin;
2
3use pin_project_lite::pin_project;
4
5use crate::stream::Stream;
6#[cfg(feature = "unstable")]
7use crate::stream::double_ended_stream::DoubleEndedStream;
8use crate::task::{Context, Poll};
9
10pin_project! {
11    /// A stream that was created from iterator.
12    ///
13    /// This stream is created by the [`from_iter`] function.
14    /// See it documentation for more.
15    ///
16    /// [`from_iter`]: fn.from_iter.html
17    #[derive(Clone, Debug)]
18    pub struct FromIter<I> {
19        iter: I,
20    }
21}
22
23/// Converts an iterator into a stream.
24///
25/// # Examples
26///
27/// ```
28/// # async_std::task::block_on(async {
29/// #
30/// use async_std::prelude::*;
31/// use async_std::stream;
32///
33/// let mut s = stream::from_iter(vec![0, 1, 2, 3]);
34///
35/// assert_eq!(s.next().await, Some(0));
36/// assert_eq!(s.next().await, Some(1));
37/// assert_eq!(s.next().await, Some(2));
38/// assert_eq!(s.next().await, Some(3));
39/// assert_eq!(s.next().await, None);
40/// #
41/// # })
42/// ```
43pub fn from_iter<I: IntoIterator>(iter: I) -> FromIter<I::IntoIter> {
44    FromIter {
45        iter: iter.into_iter(),
46    }
47}
48
49impl<I: Iterator> Stream for FromIter<I> {
50    type Item = I::Item;
51
52    fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
53        Poll::Ready(self.iter.next())
54    }
55}
56
57#[cfg(feature = "unstable")]
58impl<T: DoubleEndedIterator> DoubleEndedStream for FromIter<T> {
59    fn poll_next_back(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<T::Item>> {
60        Poll::Ready(self.iter.next_back())
61    }
62}