use std::pin::Pin;
use std::task::{Context, Poll};

use futures_core::Stream;
use tokio_stream::StreamExt;

#[tokio::main]
async fn main() {
    let mut stream = MyStream(0);

    while let Some(value) = stream.next().await {
        println!("Got {}", value);
    }
}

struct MyStream(i32);

impl Stream for MyStream {
    type Item = i32;

    fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
        if self.0 < 10 {
            self.0 += 1;
            Poll::Ready(Some(self.0))
        } else {
            Poll::Ready(None)
        }
    }
}