use std::collections::VecDeque;
pub fn capacity(configured: usize, graph_cells: usize) -> usize {
configured.max(1).max(graph_cells * 2)
}
pub fn push_bounded(buffer: &mut VecDeque<u64>, value: u64, capacity: usize) {
while buffer.len() >= capacity {
buffer.pop_front();
}
buffer.push_back(value);
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_buffer_never_exceeds_its_capacity() {
let mut buffer = VecDeque::new();
for value in 0..100 {
push_bounded(&mut buffer, value, 8);
assert!(buffer.len() <= 8, "grew to {}", buffer.len());
}
assert_eq!(buffer.back().copied(), Some(99), "the newest is kept");
assert_eq!(buffer.front().copied(), Some(92), "the oldest is dropped");
}
#[test]
fn narrowing_the_panel_shrinks_the_buffer_in_one_push() {
let mut buffer: VecDeque<u64> = (0..200).collect();
push_bounded(&mut buffer, 999, 10);
assert_eq!(buffer.len(), 10);
}
#[test]
fn the_configured_history_is_a_floor_not_a_ceiling() {
assert_eq!(capacity(120, 20), 120);
assert_eq!(capacity(120, 400), 800);
assert_eq!(capacity(0, 0), 1);
}
}