rill_protocol/
diff.rs

1use std::collections::HashSet;
2use std::hash::Hash;
3
4pub fn diff<'a, K, B, U>(basic: B, updated: U) -> (Vec<K>, Vec<K>)
5where
6    K: Hash + Eq + Clone + 'a,
7    B: IntoIterator<Item = &'a K>,
8    U: IntoIterator<Item = &'a K>,
9{
10    let basic: HashSet<_> = basic.into_iter().collect();
11    let updated: HashSet<_> = updated.into_iter().collect();
12    let to_add: Vec<_> = updated.difference(&basic).map(|k| (*k).clone()).collect();
13    let to_remove: Vec<_> = basic.difference(&updated).map(|k| (*k).clone()).collect();
14    (to_add, to_remove)
15}
16
17pub fn diff_full<'a, K, B, U>(basic: B, updated: U) -> (Vec<K>, Vec<K>, Vec<K>)
18where
19    K: Hash + Eq + Clone + 'a,
20    B: IntoIterator<Item = &'a K>,
21    U: IntoIterator<Item = &'a K>,
22{
23    let basic: HashSet<_> = basic.into_iter().collect();
24    let updated: HashSet<_> = updated.into_iter().collect();
25    let to_add: Vec<_> = updated.difference(&basic).map(|k| (*k).clone()).collect();
26    let to_remove: Vec<_> = basic.difference(&updated).map(|k| (*k).clone()).collect();
27    let to_check: Vec<_> = basic.intersection(&updated).map(|k| (*k).clone()).collect();
28    (to_add, to_remove, to_check)
29}