pipecircuit 0.0.22

Correct. Robust. Fast. Portable. Pick four.
Documentation
use super::EvidenceHighWaterMark;

#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct EvidenceGauge {
    current: u64,
    high_water: EvidenceHighWaterMark,
    invalid: bool,
}

impl EvidenceGauge {
    pub const fn new(initial: u64) -> Self {
        Self {
            current: initial,
            high_water: EvidenceHighWaterMark::starting_at(initial),
            invalid: false,
        }
    }

    pub const fn current(self) -> u64 {
        self.current
    }

    pub const fn high_water(self) -> EvidenceHighWaterMark {
        self.high_water
    }

    pub const fn invalid(self) -> bool {
        self.invalid
    }

    pub const fn valid(self) -> bool {
        !self.invalid
    }

    pub fn increase(&mut self, increment: u64) {
        match self.current.checked_add(increment) {
            Some(current) => {
                self.current = current;
                self.high_water.observe(current);
            }
            None => {
                self.current = u64::MAX;
                self.high_water.observe(u64::MAX);
                self.invalid = true;
            }
        }
    }

    pub fn decrease(&mut self, decrement: u64) {
        match self.current.checked_sub(decrement) {
            Some(current) => self.current = current,
            None => {
                self.current = 0;
                self.invalid = true;
            }
        }
    }
}