use std::{collections::HashSet, hash::Hash};
pub struct CollectionUtil;
impl CollectionUtil {
pub fn first<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> {
if vec.len() > 0 { vec.get(0) } else { None }
}
pub fn remove_first<T>(vec: &mut Vec<T>) -> Option<T> {
if vec.len() > 0 { Some(vec.remove(0)) } else { None }
}
pub fn last<'a, T>(vec: &'a Vec<T>) -> Option<&'a T> {
vec.last()
}
pub fn pop<T>(vec: &mut Vec<T>) -> Option<T> {
vec.pop()
}
pub fn reverse<T>(vec: &mut Vec<T>) {
vec.reverse()
}
pub fn distinct<T: Eq + Hash + Clone>(vec: &Vec<T>) -> Vec<T> {
let mut hash_set = HashSet::new();
for item in vec.iter() {
hash_set.insert(item.clone());
}
hash_set.into_iter().collect()
}
pub fn intersection<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
where T: Eq + Hash + Clone {
let set1: HashSet<T> = vec1.into_iter().collect();
let set2: HashSet<T> = vec2.into_iter().collect();
let result: Vec<T> = set1.intersection(&set2).cloned().collect();
result
}
pub fn union<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
where T: Eq + Hash + Clone {
let set1: HashSet<T> = vec1.into_iter().collect();
let set2: HashSet<T> = vec2.into_iter().collect();
let result: Vec<_> = set1.union(&set2).cloned().collect();
result
}
pub fn difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
where T: Eq + Hash + Clone {
let set1: HashSet<T> = vec1.into_iter().collect();
let set2: HashSet<T> = vec2.into_iter().collect();
let result: Vec<_> = set1.difference(&set2).cloned().collect();
result
}
pub fn symmetric_difference<T>(vec1: Vec<T>, vec2: Vec<T>) -> Vec<T>
where T: Eq + Hash + Clone {
let set1: HashSet<T> = vec1.into_iter().collect();
let set2: HashSet<T> = vec2.into_iter().collect();
let result: Vec<_> = set1.symmetric_difference(&set2).cloned().collect();
result
}
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
#[test]
fn test_remove_first() {
let map = HashMap::<i32, i32>::new();
}
}