scoped_sleep/
scoped_sleep.rs

1/// RAII sleep
2pub struct ScopedSleep {
3    target_time: std::time::Instant,
4}
5
6impl ScopedSleep {
7    /// Create sleep
8    ///
9    /// # Example
10    /// ```
11    /// let now = std::time::Instant::now();
12    /// {
13    ///     // Do not use `let _ = ..` here because it immediately drops ScopedSleep.
14    ///     let _guard = scoped_sleep::ScopedSleep::new(std::time::Duration::from_millis(100));
15    ///     // not sleep yet
16    ///     assert!(now.elapsed() < std::time::Duration::from_millis(20));
17    /// }
18    /// // slept
19    /// assert!(now.elapsed() > std::time::Duration::from_millis(20));
20    /// ```
21    pub fn new(sleep_duration: std::time::Duration) -> Self {
22        ScopedSleep {
23            target_time: std::time::Instant::now() + sleep_duration,
24        }
25    }
26
27    /// Create sleep from float secs value
28    ///
29    /// # Example
30    /// ```
31    /// let now = std::time::Instant::now();
32    /// {
33    ///     // Do not use `let _ = ..` here because it immediately drops ScopedSleep.
34    ///     let _guard = scoped_sleep::ScopedSleep::from_secs(0.1);
35    ///     // not sleep yet
36    ///     assert!(now.elapsed() < std::time::Duration::from_millis(10));
37    /// }
38    /// // slept
39    /// assert!(now.elapsed() > std::time::Duration::from_millis(10));
40    /// ```
41    pub fn from_secs(sleep_duration_sec: f64) -> Self {
42        Self::new(std::time::Duration::from_secs_f64(sleep_duration_sec))
43    }
44}
45
46impl Drop for ScopedSleep {
47    fn drop(&mut self) {
48        let now = std::time::Instant::now();
49        if now < self.target_time {
50            std::thread::sleep(self.target_time - now);
51        }
52    }
53}