algorithm/timer/
stamp_timer.rs1use 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}