async_interval/
impl_async_timer.rs1use alloc::boxed::Box;
2use core::{future::Future, pin::Pin, time::Duration};
3
4pub use async_timer::{Interval, Interval as AsyncTimerInterval};
5
6use crate::Intervalable;
7
8impl Intervalable for Interval {
10 fn interval(dur: Duration) -> Self {
11 Self::new(dur)
12 }
13
14 fn wait<'a>(&'a mut self) -> Pin<Box<dyn Future<Output = ()> + Send + 'a>> {
15 Box::pin(self.wait())
16 }
17
18 #[cfg(feature = "std")]
19 fn wait_for_std<'a>(
20 &'a mut self,
21 ) -> Pin<Box<dyn Future<Output = Option<std::time::Instant>> + Send + 'a>> {
22 use futures_util::FutureExt as _;
23
24 Box::pin(self.wait().map(|_| None))
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 #[allow(unused_imports)]
31 use super::*;
32
33 #[cfg(feature = "std")]
34 #[tokio::test]
35 async fn test_impl() {
36 #[cfg(feature = "std")]
37 let now = std::time::Instant::now();
38
39 let mut interval = <Interval as Intervalable>::interval(Duration::from_millis(100));
40
41 interval.wait().await;
43
44 #[cfg(feature = "std")]
45 {
46 let elapsed_dur = now.elapsed();
47 assert!(elapsed_dur.as_millis() >= 100 && elapsed_dur.as_millis() <= 105);
48 }
49
50 interval.wait().await;
52
53 #[cfg(feature = "std")]
54 {
55 let elapsed_dur = now.elapsed();
56 assert!(elapsed_dur.as_millis() >= 200 && elapsed_dur.as_millis() <= 210);
57 }
58
59 #[cfg(feature = "std")]
60 {
61 assert!(interval.wait_for_std().await.is_none());
62
63 let elapsed_dur = now.elapsed();
64 assert!(elapsed_dur.as_millis() >= 300 && elapsed_dur.as_millis() <= 315);
65 }
66 }
67
68 #[cfg(all(feature = "std", feature = "stream"))]
69 #[tokio::test]
70 async fn test_intervalable_iter_stream() {
71 use alloc::{vec, vec::Vec};
72
73 use futures_util::StreamExt as _;
74
75 let st = crate::intervalable_iter_stream(
77 0..=2,
78 <Interval as Intervalable>::interval(Duration::from_millis(100)),
79 );
80
81 #[cfg(feature = "std")]
82 let now = std::time::Instant::now();
83
84 assert_eq!(st.collect::<Vec<_>>().await, vec![0, 1, 2]);
85
86 #[cfg(feature = "std")]
87 {
88 let elapsed_dur = now.elapsed();
89 assert!(elapsed_dur.as_millis() >= 300 && elapsed_dur.as_millis() <= 310);
90 }
91 }
92}