1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use core::pin::Pin; use crate::stream::Stream; use crate::task::{Context, Poll}; /// A stream that yields elements by calling a closure. /// /// This stream is created by the [`from_fn`] function. See its /// documentation for more. /// /// [`from_fn`]: fn.from_fn.html #[derive(Clone, Debug)] pub struct FromFn<F> { f: F, } impl<F> Unpin for FromFn<F> {} /// 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 /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::prelude::*; /// use async_std::stream; /// /// let mut count = 0u8; /// let s = stream::from_fn(|| { /// count += 1; /// if count > 3 { /// None /// } else { /// Some(count) /// } /// }); /// /// 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); /// # /// # }) /// ``` pub fn from_fn<T, F>(f: F) -> FromFn<F> where F: FnMut() -> Option<T>, { FromFn { f } } impl<T, F> Stream for FromFn<F> where F: FnMut() -> Option<T>, { type Item = T; fn poll_next(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<Self::Item>> { let item = (&mut self.f)(); Poll::Ready(item) } }