1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use std::collections::HashMap;
use std::time::{SystemTime, UNIX_EPOCH};
struct Value {
pub start: u64,
pub limit: u64,
}
pub struct ChronoTimer {
timers: HashMap<String, Value>,
}
impl ChronoTimer {
pub fn new() -> ChronoTimer {
ChronoTimer {
timers: HashMap::new(),
}
}
pub fn after_x_ms(&mut self, id: &str, ms: u64) -> bool {
let mut value = &mut Value {
start: 0,
limit: 99,
};
let mut new_flag = false;
{
let result = self.timers.get_mut(id);
match result {
Some(v) => value = v,
None => new_flag = true,
}
}
if new_flag {
self.timers.insert(
id.to_string(),
Value {
start: current_time_milliseconds(),
limit: ms,
},
);
return false;
}
if (current_time_milliseconds() - value.start) >= value.limit {
self.timers.remove(id);
return true;
} else {
return false;
}
}
pub fn every_x_ms(&mut self, id: &str, ms: u64) -> bool {
let mut value = &mut Value {
start: 0,
limit: 99,
};
let mut new_flag = false;
{
let result = self.timers.get_mut(id);
match result {
Some(v) => value = v,
None => new_flag = true,
}
}
if new_flag {
self.timers.insert(
id.to_string(),
Value {
start: current_time_milliseconds(),
limit: ms,
},
);
return false;
}
if (current_time_milliseconds() - value.start) >= value.limit {
value.start = current_time_milliseconds();
return true;
} else {
return false;
}
}
}
fn current_time_milliseconds() -> u64 {
let time = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards");
let time_in_ms = time.as_secs() * 1000 + time.subsec_nanos() as u64 / 1_000_000;
time_in_ms
}