use std::hash::Hash; use std::collections::HashMap; pub fn map_drain_filter(map : &mut HashMap, filter : impl Fn(&K, &V) -> bool) -> Vec<(K, V)> { let mut removed = vec![]; let mut retain = vec![]; for (k, v) in map.drain() { if filter(&k, &v) { removed.push((k, v)); } else { retain.push((k, v)); } } map.extend(retain); removed } pub trait KVVecToKeysOrValues { fn keys(self) -> Vec; fn values(self) -> Vec; } impl KVVecToKeysOrValues for Vec<(K,V)> { fn keys(self) -> Vec { self.into_iter().map(|(k, _v)| k).collect() } fn values(self) -> Vec { self.into_iter().map(|(_k, v)| v).collect() } }