use std::collections::HashSet;
use std::hash::Hash;
pub fn intersection<T: Eq + Clone + Hash>(array1: &[T], array2: &[T]) -> Vec<T> {
let set1: HashSet<&T> = array1.iter().collect();
let set2: HashSet<&T> = array2.iter().collect();
let common_elements: Vec<T> = set1
.intersection(&set2)
.cloned()
.cloned() .collect();
common_elements
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_intersection_with_common_elements() {
let array1 = vec![1, 2, 3, 4, 5];
let array2 = vec![4, 5, 6, 7, 8];
let mut result = intersection(&array1, &array2);
result.sort(); let mut expected = vec![4, 5];
expected.sort(); assert_eq!(result, expected);
}
#[test]
fn test_intersection_with_no_common_elements() {
let array1 = vec![1, 2, 3];
let array2 = vec![4, 5, 6];
let result = intersection(&array1, &array2);
assert_eq!(result, vec![]);
}
#[test]
fn test_intersection_with_empty_arrays() {
let array1: Vec<i32> = vec![];
let array2: Vec<i32> = vec![];
let result = intersection(&array1, &array2);
assert_eq!(result, vec![]);
}
}