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}