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