Skip to main content

wowlab_engine_domain/pool/
rolling.rs

1use 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;