From bb5e6272f4705c9cac65f66ca89f56558d33e08f Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Tue, 5 Jul 2022 19:53:39 +0300 Subject: Explicitly implement NumberSource --- README.md | 1 + src/main.rs | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6d1d8d4..3a5a9b1 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ https://github.com/tokio-rs/async-stream This page has a good review https://blog.yoshuawuyts.com/rust-streams/ +More good stuff at https://www.qovery.com/blog/a-guided-tour-of-streams-in-rust ## Design diff --git a/src/main.rs b/src/main.rs index 54e8529..2c31bd9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,7 +36,19 @@ fn number_source() -> impl Stream { } } -fn double>(input: S) -> impl Stream { +struct NumberSource { + i: u32, +} + +impl Stream for NumberSource { + type Item = u32; + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + self.i += 1; + Poll::Ready(Some(self.i)) + } +} + +fn double>(input: S) -> impl Stream { stream! { for await val in input { yield val * 2 @@ -46,7 +58,8 @@ fn double>(input: S) -> impl Stream { #[tokio::main] async fn main() { - let s = double(number_source()); + let number_source = NumberSource { i: 0 }; + let s = double(number_source); pin_mut!(s); // needed for iteration while let Some(value) = s.next().await { -- cgit v1.3.1