diff options
Diffstat (limited to 'src/statistics/mechanics.rs')
| -rw-r--r-- | src/statistics/mechanics.rs | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/src/statistics/mechanics.rs b/src/statistics/mechanics.rs new file mode 100644 index 0000000..5a16204 --- /dev/null +++ b/src/statistics/mechanics.rs @@ -0,0 +1,42 @@ +use super::gamedata::Mechanic; +use super::math::{Monoid, RecordFunc, Semigroup}; + +use std::fmt; + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Counter(u32); + +impl Semigroup for Counter { +    #[inline] +    fn combine(&self, other: &Counter) -> Counter { +        Counter(self.0 + other.0) +    } +} + +impl Monoid for Counter { +    #[inline] +    fn mempty() -> Counter { +        Counter(0) +    } +} + +#[derive(Clone, Default)] +pub struct MechanicLog { +    inner: RecordFunc<u64, (&'static Mechanic, u64), Counter>, +} + +impl MechanicLog { +    pub fn increase(&mut self, time: u64, mechanic: &'static Mechanic, agent: u64) { +        self.inner.insert(time, (mechanic, agent), Counter(1)); +    } + +    pub fn count<F: FnMut(&'static Mechanic, u64) -> bool>(&self, mut filter: F) -> u32 { +        self.inner.tally_only(|(a, b)| filter(a, *b)).0 +    } +} + +impl fmt::Debug for MechanicLog { +    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +        write!(f, "MechanicLog {{ ... }}") +    } +}  | 
