[][src]Function stream_generator::generate_stream

pub fn generate_stream<T, F, R>(generator: F) -> impl Stream<Item = T> where
    F: FnOnce(Yielder<T>) -> R,
    R: Future<Output = ()>, 

Creates a stream from generator.

generator will receive a yielder object as an argument and should return a future (usually an async block) that will produce the stream's values using the yielder. If the future finishes, the stream will end after producing all yielded values. If the future never finishes, the stream will also never finish.

use futures::{stream::StreamExt, Stream};
use stream_generator::generate_stream;

fn my_stream(start: u32) -> impl Stream<Item=u32> {
    generate_stream(move |mut y| async move {
        for i in start.. {
            y.send(i).await;
            if i == 45 {
                break;
            }
        }
    })
}

#[tokio::main]
async fn main() {
    let values: Vec<_> = my_stream(42).collect().await;
    assert_eq!(values, vec![42, 43, 44, 45]);
}