pub fn omit_by<K, V, F>(
map: &std::collections::HashMap<K, V>,
predicate: F,
) -> std::collections::HashMap<K, V>
where
K: std::cmp::Eq + std::hash::Hash + Clone,
V: Clone,
F: Fn(&K, &V) -> bool,
{
let mut result = std::collections::HashMap::new();
for (k, v) in map.iter() {
if !predicate(k, v) {
result.insert(k.clone(), v.clone());
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashMap;
#[test]
fn test_omit_by_some_predicates() {
let mut map = HashMap::new();
map.insert("a", 1);
map.insert("b", 2);
map.insert("c", 3);
let result = omit_by(&map, |_, v| *v > 1);
assert_eq!(result.len(), 1);
assert!(result.contains_key("a"));
assert!(!result.contains_key("b"));
assert!(!result.contains_key("c"));
}
#[test]
fn test_omit_by_all_predicates_true() {
let mut map = HashMap::new();
map.insert("a", 1);
map.insert("b", 2);
let result = omit_by(&map, |_, _| true);
assert_eq!(result.len(), 0);
}
#[test]
fn test_omit_by_all_predicates_false() {
let mut map = HashMap::new();
map.insert("a", 1);
map.insert("b", 2);
let result = omit_by(&map, |_, _| false);
assert_eq!(result.len(), 2);
assert!(result.contains_key("a"));
assert!(result.contains_key("b"));
}
#[test]
fn test_omit_by_empty_map() {
let map: HashMap<&str, i32> = HashMap::new();
let result = omit_by(&map, |_, _| true);
assert_eq!(result.len(), 0);
}
#[test]
fn test_omit_by_with_strings() {
let mut map = HashMap::new();
map.insert("apple", "red");
map.insert("banana", "yellow");
map.insert("grape", "purple");
let result = omit_by(&map, |_, v| v.starts_with('y'));
assert_eq!(result.len(), 2);
assert!(result.contains_key("apple"));
assert!(!result.contains_key("banana"));
assert!(result.contains_key("grape"));
}
#[test]
fn test_omit_by_with_mixed_types() {
let mut map = HashMap::new();
map.insert(1, "one");
map.insert(2, "two");
map.insert(3, "three");
let result = omit_by(&map, |k, _| *k % 2 == 0);
assert_eq!(result.len(), 2);
assert!(result.contains_key(&1));
assert!(!result.contains_key(&2));
assert!(result.contains_key(&3));
}
#[test]
fn test_omit_by_with_complex_predicate() {
let mut map = HashMap::new();
map.insert("a", vec![1, 2, 3]);
map.insert("b", vec![4, 5]);
map.insert("c", vec![6]);
let result = omit_by(&map, |_, v| v.len() < 3);
assert_eq!(result.len(), 1);
assert!(result.contains_key("a"));
assert!(!result.contains_key("b"));
assert!(!result.contains_key("c"));
}
}