algorithm/timer/
stamp_timer.rs

1use std::time::{Duration, SystemTime, UNIX_EPOCH};
2
3use super::Timer;
4
5pub struct StampTimer<T> {
6    duration: Duration,
7    is_sec: bool,
8    pub val: T,
9}
10
11impl<T> StampTimer<T> {
12    pub fn new(val: T, duration: Duration) -> Self {
13        let is_sec = duration.as_secs() as u128 * 1000 == duration.as_millis();
14        Self { val, duration, is_sec }
15    }
16
17    pub fn new_second(val: T, duration: Duration) -> Self {
18        Self {
19            val,
20            duration,
21            is_sec: true,
22        }
23    }
24
25    pub fn new_millis(val: T, duration: Duration) -> Self {
26        Self {
27            val,
28            duration,
29            is_sec: false,
30        }
31    }
32}
33
34impl<T> Timer for StampTimer<T> {
35    fn when(&self) -> u64 {
36        let when = SystemTime::now() + self.duration;
37        if self.is_sec {
38            when.duration_since(UNIX_EPOCH).unwrap().as_secs()
39        } else {
40            when.duration_since(UNIX_EPOCH).unwrap().as_millis() as u64
41        }
42    }
43}