From 40c4e1a29d7946faa5052389517d1f01b0f2d7d9 Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 30 Oct 2019 10:33:59 +0900 Subject: [PATCH 1/2] feat: Add stream::from_iter --- src/stream/from_iter.rs | 44 +++++++++++++++++++++++++++++++++++++++++ src/stream/mod.rs | 2 ++ 2 files changed, 46 insertions(+) create mode 100644 src/stream/from_iter.rs diff --git a/src/stream/from_iter.rs b/src/stream/from_iter.rs new file mode 100644 index 0000000..8d3dba7 --- /dev/null +++ b/src/stream/from_iter.rs @@ -0,0 +1,44 @@ +use std::pin::Pin; + +use pin_project_lite::pin_project; + +use crate::stream::Stream; +use crate::task::{Context, Poll}; + +pin_project! { + #[derive(Debug)] + pub struct FromIter { + iter: I, + } +} + +/// # 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(iter: I) -> FromIter<::IntoIter> { + FromIter { + iter: iter.into_iter(), + } +} + +impl Stream for FromIter { + type Item = I::Item; + + fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + Poll::Ready(self.iter.next()) + } +} diff --git a/src/stream/mod.rs b/src/stream/mod.rs index 6db0dbe..07eecf2 100644 --- a/src/stream/mod.rs +++ b/src/stream/mod.rs @@ -302,6 +302,7 @@ pub use empty::{empty, Empty}; pub use from_fn::{from_fn, FromFn}; +pub use from_iter::{from_iter, FromIter}; pub use once::{once, Once}; pub use repeat::{repeat, Repeat}; pub use repeat_with::{repeat_with, RepeatWith}; @@ -313,6 +314,7 @@ pub(crate) mod stream; mod empty; mod from_fn; +mod from_iter; mod once; mod repeat; mod repeat_with; From 063798ce494b3b20a1e7ef1b08f6a0cd0b0f2d9b Mon Sep 17 00:00:00 2001 From: k-nasa Date: Fri, 1 Nov 2019 21:18:43 +0900 Subject: [PATCH 2/2] Add doc --- src/stream/from_iter.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/stream/from_iter.rs b/src/stream/from_iter.rs index 8d3dba7..43bc961 100644 --- a/src/stream/from_iter.rs +++ b/src/stream/from_iter.rs @@ -6,6 +6,12 @@ use crate::stream::Stream; use crate::task::{Context, Poll}; pin_project! { + /// A stream that created from iterator + /// + /// This stream is created by the [`from_iter`] function. + /// See it documentation for more. + /// + /// [`from_iter`]: fn.from_iter.html #[derive(Debug)] pub struct FromIter { iter: I,