wowlab_engine_domain/pool/
rolling.rs1use std::hash::Hash;
2
3use super::base::Pool;
4
5#[derive(Clone, Debug)]
6pub struct RollingTickPool<K> {
7 state: Pool<K, f64>,
8}
9
10impl<K> RollingTickPool<K>
11where
12 K: Eq + Hash,
13{
14 #[must_use]
15 pub fn new() -> Self {
16 Self::default()
17 }
18
19 pub fn mult(&self, key: &K) -> f64 {
20 self.state.get(key).copied().unwrap_or(1.0)
21 }
22
23 pub fn combine(
24 &mut self,
25 key: K,
26 old_ticks_left: f64,
27 new_base_ticks: f64,
28 new_ticks_left: f64,
29 new_mult: f64,
30 ) {
31 if new_ticks_left <= 0.0 {
32 return;
33 }
34
35 let old_mult = self.mult(&key);
36 let combined =
37 (old_ticks_left.max(0.0) * old_mult + new_base_ticks * new_mult) / new_ticks_left;
38
39 self.state.set(key, combined);
40 }
41
42 pub fn remove(&mut self, key: &K) {
43 self.state.remove(key);
44 }
45
46 pub fn clear(&mut self) {
47 self.state.clear();
48 }
49}
50
51impl<K> Default for RollingTickPool<K> {
52 fn default() -> Self {
53 Self {
54 state: Pool::default(),
55 }
56 }
57}
58
59#[cfg(test)]
60#[path = "rolling/tests.rs"]
61mod tests;