#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub struct Budget {
remaining: u64,
exhausted: bool,
}
impl Budget {
#[must_use]
pub const fn new(steps: u64) -> Budget {
Budget {
remaining: steps,
exhausted: false,
}
}
#[must_use]
pub const fn unlimited() -> Budget {
Budget::new(u64::MAX)
}
#[must_use]
pub const fn remaining(&self) -> u64 {
self.remaining
}
#[must_use]
pub const fn is_exhausted(&self) -> bool {
self.exhausted
}
pub(crate) fn charge(&mut self, steps: u64) -> bool {
if self.remaining >= steps {
self.remaining -= steps;
true
} else {
self.exhausted = true;
false
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_charge_takes_or_refuses() {
let mut b = Budget::new(10);
assert!(b.charge(4));
assert_eq!(b.remaining(), 6);
assert!(!b.charge(7));
assert!(b.is_exhausted());
assert_eq!(b.remaining(), 6);
assert!(b.charge(6));
assert_eq!(b.remaining(), 0);
}
}