pub struct ChangeLogger<T> {
last: Option<T>,
}
impl<T: PartialEq + Clone> Default for ChangeLogger<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: PartialEq + Clone> ChangeLogger<T> {
#[must_use]
pub const fn new() -> Self {
Self { last: None }
}
#[must_use]
pub fn should_log(&mut self, next: &T) -> bool {
if self.last.as_ref() == Some(next) {
return false;
}
self.last = Some(next.clone());
true
}
pub fn clear(&mut self) {
self.last = None;
}
}
#[cfg(test)]
mod tests {
use super::ChangeLogger;
#[test]
fn change_logger_emits_only_on_change() {
let mut logger = ChangeLogger::new();
assert!(logger.should_log(&"a"));
assert!(!logger.should_log(&"a"));
assert!(logger.should_log(&"b"));
assert!(!logger.should_log(&"b"));
logger.clear();
assert!(logger.should_log(&"b"));
}
}