dev_tool/
collection_util.rs1use std::{collections::HashSet, hash::Hash};
2
3pub struct CollectionUtil;
4
5impl CollectionUtil {
7
8 pub fn first<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> {
10 if vec.len() > 0 { vec.get(0) } else { None }
11 }
12
13 pub fn remove_first<T>(vec: &mut Vec<T>) -> Option<T> {
15 if vec.len() > 0 { Some(vec.remove(0)) } else { None }
16 }
17
18 pub fn last<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> {
20 vec.last()
21 }
22
23 pub fn pop<T>(vec: &mut Vec<T>) -> Option<T> {
25 vec.pop()
26 }
27
28 pub fn reverse<T>(vec: &mut Vec<T>) {
30 vec.reverse()
31 }
32
33 pub fn distinct<T: Eq + Hash + Clone>(vec: &Vec<T>) -> Vec<T> {
35 let mut hash_set = HashSet::new();
36 for item in vec.iter() {
37 hash_set.insert(item.clone());
38 }
39 hash_set.into_iter().collect()
40 }
41
42 pub fn intersection<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
44 where T: Eq + Hash + Clone {
45 let set1: HashSet<T> = vec1.into_iter().collect();
47 let set2: HashSet<T> = vec2.into_iter().collect();
48 let result: Vec<T> = set1.intersection(&set2).cloned().collect();
50 result
51 }
52
53 pub fn union<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
55 where T: Eq + Hash + Clone {
56 let set1: HashSet<T> = vec1.into_iter().collect();
57 let set2: HashSet<T> = vec2.into_iter().collect();
58 let result: Vec<_> = set1.union(&set2).cloned().collect();
60 result
61 }
62
63 pub fn difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
65 where T: Eq + Hash + Clone {
66 let set1: HashSet<T> = vec1.into_iter().collect();
67 let set2: HashSet<T> = vec2.into_iter().collect();
68 let result: Vec<_> = set1.difference(&set2).cloned().collect();
70 result
71 }
72
73 pub fn symmetric_difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
75 where T: Eq + Hash + Clone {
76 let set1: HashSet<T> = vec1.into_iter().collect();
77 let set2: HashSet<T> = vec2.into_iter().collect();
78 let result: Vec<_> = set1.symmetric_difference(&set2).cloned().collect();
80 result
81 }
82
83
84}
85
86
87#[cfg(test)]
88mod tests {
89 use std::collections::HashMap;
90
91
92 #[test]
93 fn test_remove_first() {
94 let map = HashMap::<i32, i32>::new();
95 }
96}
97