lowdash/
omit_by_keys.rs

1/// Filters a map by omitting specified keys.
2///
3/// Iterates over the provided keys and removes them from a cloned version of the input map.
4/// Only key-value pairs not present in the keys slice are included in the result map.
5///
6/// # Arguments
7/// * `map` - The input map to filter.
8/// * `keys` - A slice of keys to omit from the result map.
9///
10/// # Returns
11/// * `HashMap<K, V>` - A new map containing only the key-value pairs that are not in the keys slice.
12///
13/// # Examples
14/// ```rust
15/// use lowdash::omit_by_keys;
16/// use std::collections::HashMap;
17///
18/// let mut map = HashMap::new();
19/// map.insert("a", 1);
20/// map.insert("b", 2);
21/// map.insert("c", 3);
22///
23/// let keys = vec!["b", "d"];
24/// let result = omit_by_keys(&map, &keys);
25/// assert_eq!(result.len(), 2);
26/// assert!(result.contains_key("a"));
27/// assert!(result.contains_key("c"));
28/// assert!(!result.contains_key("b"));
29/// ```
30pub 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}