hotmic 0.8.2

high-speed metrics collection library
Documentation
use fnv::FnvBuildHasher;
use hashbrown::HashMap;
use std::hash::Hash;

pub(crate) struct Counter<T> {
    data: HashMap<T, i64, FnvBuildHasher>,
}

impl<T: Clone + Eq + Hash> Counter<T> {
    pub fn new() -> Counter<T> {
        Counter {
            data: HashMap::<T, i64, FnvBuildHasher>::default(),
        }
    }

    pub fn update(&mut self, key: T, delta: i64) {
        let value = self.data.entry(key).or_insert(0);
        *value += delta;
    }

    pub fn values(&self) -> Vec<(T, i64)> { self.data.iter().map(|(k, v)| (k.clone(), *v)).collect() }
}

#[cfg(test)]
mod tests {
    use super::Counter;

    #[test]
    fn test_counter_simple_update() {
        let mut counter = Counter::new();

        let key = "foo";
        counter.update(key.clone(), 42);

        let values = counter.values();
        assert_eq!(values.len(), 1);
        assert_eq!(values[0].1, 42);
    }
}