#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Change {
Added,
Removed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct CrossDiff<'a, T> {
current: &'a [T],
incoming: &'a [T],
}
impl<'a, T> CrossDiff<'a, T>
where
T: PartialEq,
{
pub fn new(current: &'a [T], incoming: &'a [T]) -> Self {
Self { current, incoming }
}
#[must_use]
pub fn removed(&self) -> Vec<(&'a T, Change)> {
self.current
.iter()
.filter(|&item| !self.incoming.contains(item))
.map(|item| (item, Change::Removed))
.collect()
}
#[must_use]
pub fn added(&self) -> Vec<(&'a T, Change)> {
self.incoming
.iter()
.filter(|&item| !self.current.contains(item))
.map(|item| (item, Change::Added))
.collect()
}
}