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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
use core::pin::Pin; use crate::stream::Stream; use crate::task::{Context, Poll}; /// A stream that repeats elements of type `T` endlessly by applying a provided closure. /// /// This stream is created by the [`repeat_with`] function. See its /// documentation for more. /// /// [`repeat_with`]: fn.repeat_with.html #[derive(Clone, Debug)] pub struct RepeatWith<F> { f: F, } impl<F> Unpin for RepeatWith<F> {} /// Creates a new stream that repeats elements of type `A` endlessly by applying the provided closure. /// /// # Examples /// /// Basic usage: /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::prelude::*; /// use async_std::stream; /// /// let s = stream::repeat_with(|| 1); /// /// pin_utils::pin_mut!(s); /// /// assert_eq!(s.next().await, Some(1)); /// assert_eq!(s.next().await, Some(1)); /// assert_eq!(s.next().await, Some(1)); /// assert_eq!(s.next().await, Some(1)); /// # }) /// ``` /// /// Going finite: /// /// ``` /// # async_std::task::block_on(async { /// # /// use async_std::prelude::*; /// use async_std::stream; /// /// let mut n = 1; /// let s = stream::repeat_with(|| { /// let item = n; /// n *= 2; /// item /// }) /// .take(4); /// /// 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(4)); /// assert_eq!(s.next().await, Some(8)); /// assert_eq!(s.next().await, None); /// # }) /// ``` pub fn repeat_with<T, F>(repeater: F) -> RepeatWith<F> where F: FnMut() -> T, { RepeatWith { f: repeater } } impl<T, F> Stream for RepeatWith<F> where F: FnMut() -> 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(Some(item)) } }