1pub fn omit_by_keys<K, V>(
31 map: &std::collections::HashMap<K, V>,
32 keys: &[K],
33) -> std::collections::HashMap<K, V>
34where
35 K: std::cmp::Eq + std::hash::Hash + Clone,
36 V: Clone,
37{
38 let mut result = map.clone();
39 for key in keys {
40 result.remove(key);
41 }
42 result
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48 use std::collections::HashMap;
49
50 #[test]
51 fn test_omit_by_keys_existing_keys() {
52 let mut map = HashMap::new();
53 map.insert("a", 1);
54 map.insert("b", 2);
55 map.insert("c", 3);
56
57 let keys = vec!["b", "d"];
58 let result = omit_by_keys(&map, &keys);
59 assert_eq!(result.len(), 2);
60 assert!(result.contains_key("a"));
61 assert!(result.contains_key("c"));
62 assert!(!result.contains_key("b"));
63 }
64
65 #[test]
66 fn test_omit_by_keys_some_missing_keys() {
67 let mut map = HashMap::new();
68 map.insert("a", 1);
69 map.insert("b", 2);
70
71 let keys = vec!["a", "c"];
72 let result = omit_by_keys(&map, &keys);
73 assert_eq!(result.len(), 1);
74 assert!(!result.contains_key("a"));
75 assert!(result.contains_key("b"));
76 assert!(!result.contains_key("c"));
77 }
78
79 #[test]
80 fn test_omit_by_keys_all_missing_keys() {
81 let mut map = HashMap::new();
82 map.insert("a", 1);
83 map.insert("b", 2);
84
85 let keys = vec!["c", "d"];
86 let result = omit_by_keys(&map, &keys);
87 assert_eq!(result.len(), 2);
88 assert!(result.contains_key("a"));
89 assert!(result.contains_key("b"));
90 assert!(!result.contains_key("c"));
91 assert!(!result.contains_key("d"));
92 }
93
94 #[test]
95 fn test_omit_by_keys_empty_keys() {
96 let mut map = HashMap::new();
97 map.insert("a", 1);
98 map.insert("b", 2);
99
100 let keys: Vec<&str> = vec![];
101 let result = omit_by_keys(&map, &keys);
102 assert_eq!(result.len(), 2);
103 assert!(result.contains_key("a"));
104 assert!(result.contains_key("b"));
105 }
106
107 #[test]
108 fn test_omit_by_keys_empty_map() {
109 let map: HashMap<&str, i32> = HashMap::new();
110 let keys = vec!["a", "b"];
111 let result = omit_by_keys(&map, &keys);
112 assert_eq!(result.len(), 0);
113 }
114
115 #[test]
116 fn test_omit_by_keys_with_integers() {
117 let mut map = HashMap::new();
118 map.insert(1, "one");
119 map.insert(2, "two");
120 map.insert(3, "three");
121
122 let keys = vec![2, 4];
123 let result = omit_by_keys(&map, &keys);
124 assert_eq!(result.len(), 2);
125 assert!(result.contains_key(&1));
126 assert!(result.contains_key(&3));
127 assert!(!result.contains_key(&2));
128 }
129}