[][src]Function async_std::stream::from_fn

pub fn from_fn<T, F, Fut>(f: F) -> FromFn<F, Fut, T> where
    F: FnMut() -> Fut,
    Fut: Future<Output = Option<T>>, 

Creates a new stream where to produce each new element a provided closure is called.

This allows creating a custom stream with any behaviour without using the more verbose syntax of creating a dedicated type and implementing a Stream trait for it.

Examples

use async_std::prelude::*;
use async_std::sync::Mutex;
use std::sync::Arc;
use async_std::stream;

let count = Arc::new(Mutex::new(0u8));
let s = stream::from_fn(|| {
    let count = Arc::clone(&count);

    async move {
        *count.lock().await += 1;

        if *count.lock().await > 3 {
            None
        } else {
            Some(*count.lock().await)
        }
    }
});

pin_utils::pin_mut!(s);
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);