1use futures_util::{stream, Stream};
2
3use crate::Intervalable;
4
5pub fn intervalable_iter_stream<I, INTVL>(iter: I, interval: INTVL) -> impl Stream<Item = I::Item>
7where
8 I: IntoIterator,
9 INTVL: Intervalable,
10{
11 stream::unfold(
12 (iter.into_iter(), interval),
13 |(mut iter, mut interval)| async move {
14 if let Some(item) = iter.next() {
15 interval.wait().await;
16 Some((item, (iter, interval)))
17 } else {
18 None
19 }
20 },
21 )
22}
23
24pub fn intervalable_repeat_stream<T, INTVL>(item: T, interval: INTVL) -> impl Stream<Item = T>
26where
27 T: Clone,
28 INTVL: Intervalable,
29{
30 stream::unfold((item, interval), |(item, mut interval)| async move {
31 interval.wait().await;
32 Some((item.clone(), (item, interval)))
33 })
34}
35
36pub fn intervalable_repeat_with_stream<A, F, INTVL>(
38 repeater: F,
39 interval: INTVL,
40) -> impl Stream<Item = A>
41where
42 F: FnMut() -> A,
43 INTVL: Intervalable,
44{
45 stream::unfold(
46 (repeater, interval),
47 |(mut repeater, mut interval)| async move {
48 interval.wait().await;
49 Some((repeater(), (repeater, interval)))
50 },
51 )
52}