use async_stream::stream; use futures_util::pin_mut; use futures_util::stream::StreamExt; use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; use std::time::{Duration, Instant}; struct Delay { when: Instant, } impl Future for Delay { type Output = &'static str; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<&'static str> { if Instant::now() >= self.when { Poll::Ready("done") } else { // Ignore this line for now. cx.waker().wake_by_ref(); Poll::Pending } } } #[tokio::main] async fn main() { let s = stream! { let mut when = Instant::now(); for i in 0..10 { let delay = Delay { when }; delay.await; yield i; when += Duration::from_millis(1000); } }; pin_mut!(s); // needed for iteration while let Some(value) = s.next().await { println!("got {}", value); } }