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}