async_interval/
impl_async_timer.rs

1use 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
8//
9impl 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        //
42        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        //
51        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        //
76        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}