1use std::collections::HashSet;
2use std::hash::Hash;
3
4#[derive(Debug, Clone)]
5pub struct ListTool;
6
7impl ListTool {
8 pub fn new() -> Self { Self }
9
10 pub fn chunk<T: Clone>(&self, list: &[T], size: usize) -> Vec<Vec<T>> {
11 if size == 0 { return vec![list.to_vec()]; }
12 list.chunks(size).map(|c| c.to_vec()).collect()
13 }
14
15 pub fn unique<T: Clone + Eq + Hash>(&self, list: &[T]) -> Vec<T> {
16 let mut seen = HashSet::new();
17 list.iter().filter(|x| seen.insert((*x).clone())).cloned().collect()
18 }
19
20 pub fn intersect<T: Clone + Eq + Hash>(&self, a: &[T], b: &[T]) -> Vec<T> {
21 let set_b: HashSet<_> = b.iter().collect();
22 self.unique(a).into_iter().filter(|x| set_b.contains(x)).collect()
23 }
24
25 pub fn union<T: Clone + Eq + Hash>(&self, a: &[T], b: &[T]) -> Vec<T> {
26 let mut res = a.to_vec();
27 res.extend(b.iter().cloned());
28 self.unique(&res)
29 }
30
31 pub fn difference<T: Clone + Eq + Hash>(&self, a: &[T], b: &[T]) -> Vec<T> {
32 let set_b: HashSet<_> = b.iter().collect();
33 self.unique(a).into_iter().filter(|x| !set_b.contains(x)).collect()
34 }
35}
36
37impl Default for ListTool {
38 fn default() -> Self { Self::new() }
39}