#[derive(Debug, Clone)]
pub struct EveryN {
factor: u32,
counter: u32,
}
impl EveryN {
pub fn new(factor: u32) -> Self {
assert!(factor > 0, "downsample factor must be > 0");
Self { factor, counter: 0 }
}
#[inline]
pub fn keep(&mut self) -> bool {
self.counter += 1;
if self.counter < self.factor {
return false;
}
self.counter = 0;
true
}
pub fn reset(&mut self) {
self.counter = 0;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn emits_every_nth() {
let mut d = EveryN::new(3);
let keeps: Vec<bool> = (0..9).map(|_| d.keep()).collect();
assert_eq!(
keeps,
vec![false, false, true, false, false, true, false, false, true]
);
}
#[test]
fn factor_one_keeps_all() {
let mut d = EveryN::new(1);
assert!((0..5).all(|_| d.keep()));
}
#[test]
fn reset_restarts_counter() {
let mut d = EveryN::new(3);
d.keep(); d.keep(); d.reset();
let keeps: Vec<bool> = (0..3).map(|_| d.keep()).collect();
assert_eq!(keeps, vec![false, false, true]);
}
#[test]
#[should_panic(expected = "downsample factor must be > 0")]
fn factor_zero_panics() {
let _ = EveryN::new(0);
}
}