Skip to main content

teaql_tool_std/
list.rs

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}