itermap 0.4.0

Iterator tools for maps (`HashMap`, `BTreeMap`, etc.)
Documentation
mod keys;
mod values;

pub use keys::FilterKeys;
pub use values::FilterValues;

#[cfg(test)]
mod test {
    use std::collections::{HashMap, HashSet};

    use map_vec::{Map, Set};
    use pretty_assertions::assert_eq;

    use crate::IterMap;

    #[test]
    fn hash() {
        let map = HashMap::from([
            ('a', HashSet::from([1, 2, 3])),
            ('b', HashSet::from([4, 5, 6])),
            ('c', HashSet::from([7, 8, 9])),
        ]);

        let expected = map
            .clone()
            .remove_entry(&'b')
            .into_iter()
            .collect::<HashMap<_, _>>();

        let filtered = map
            .clone()
            .into_iter()
            .filter_keys(|c| c == &'b')
            .collect::<HashMap<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");

        let filtered = map
            .into_iter()
            .filter_values(|v| v.contains(&5))
            .collect::<HashMap<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");
    }

    #[test]
    fn hash_ref() {
        let map = HashMap::from([
            ('a', HashSet::from([1, 2, 3])),
            ('b', HashSet::from([4, 5, 6])),
            ('c', HashSet::from([7, 8, 9])),
        ]);

        let expected = map
            .get_key_value(&'b')
            .into_iter()
            .collect::<HashMap<_, _>>();

        let filtered = map
            .iter()
            .filter_keys(|c| c == &&'b')
            .collect::<HashMap<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");

        let filtered = map
            .iter()
            .filter_values(|v| v.contains(&5))
            .collect::<HashMap<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");
    }

    #[test]
    fn map() {
        let map = Map::from_iter([
            ('a', Set::from_iter([1, 2, 3])),
            ('b', Set::from_iter([4, 5, 6])),
            ('c', Set::from_iter([7, 8, 9])),
        ]);

        let expected = map.get_key_value(&'b').into_iter().collect::<Map<_, _>>();

        let filtered = map
            .iter()
            .filter_keys(|c| c == &&'b')
            .collect::<Map<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");

        let filtered = map
            .iter()
            .filter_values(|v| v.contains(&5))
            .collect::<Map<_, _>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");
    }

    #[test]
    fn vec() {
        let vec = Vec::from([('a', 'A'), ('b', 'B'), ('c', 'C')]);

        let expected = vec
            .iter()
            .find(|(k, _v)| k == &'b')
            .cloned()
            .into_iter()
            .collect::<Vec<_>>();

        let filtered = vec
            .clone()
            .into_iter()
            .filter_keys(|k| k == &'b')
            .collect::<Vec<_>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");

        let filtered = vec
            .into_iter()
            .filter_values(|v| v == &'B')
            .collect::<Vec<_>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");
    }

    #[test]
    fn vec_ref() {
        let vec = Vec::from([('a', 'A'), ('b', 'B'), ('c', 'C')]);

        let expected = vec
            .iter()
            .find(|(k, _v)| k == &'b')
            .map(|(k, v)| (k, v))
            .into_iter()
            .collect::<Vec<_>>();

        let filtered = vec
            .iter()
            .map(|(k, v)| (k, v))
            .filter_keys(|k| k == &&'b')
            .collect::<Vec<_>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");

        let filtered = vec
            .iter()
            .map(|(k, v)| (k, v))
            .filter_values(|v| v == &&'B')
            .collect::<Vec<_>>();
        assert_eq!(expected, filtered);
        println!("{filtered:#?}");
    }
}