mckernant1_tools/iter/
map.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use std::collections::HashMap;
use std::hash::Hash;

pub trait MapUtils {
    type Item;

    fn associate_to_map<K, V, F>(self, transform: F) -> HashMap<K, V>
    where
        F: Fn(Self::Item) -> (K, V),
        K: Eq,
        K: Hash;

    fn associate_with_to_map<B, F>(self, transform: F) -> HashMap<Self::Item, B>
    where
        F: Fn(Self::Item) -> B;
}

impl<I, T> MapUtils for I
where
    I: IntoIterator<Item = T>,
    T: Hash,
    T: Eq,
    T: Clone,
{
    type Item = T;

    fn associate_to_map<K, V, F>(self, transform: F) -> HashMap<K, V>
    where
        F: Fn(Self::Item) -> (K, V),
        K: Eq,
        K: Hash,
    {
        self.into_iter().map(|it| transform(it)).collect()
    }

    fn associate_with_to_map<B, F>(self, transform: F) -> HashMap<Self::Item, B>
    where
        F: Fn(Self::Item) -> B,
    {
        self.into_iter()
            .map(|it| (it.clone(), transform(it)))
            .collect()
    }
}

#[cfg(test)]
mod test {
    use crate::iter::map::MapUtils;
    use std::collections::HashMap;

    #[test]
    fn test_associate_to_map() {
        let v = vec![1, 2];
        let v = v.associate_to_map(|it| (it, it));
        assert_eq!(v, HashMap::from([(1, 1), (2, 2)]));
    }

    #[test]
    fn test_associate_with_to_map() {
        let v = vec![1, 2];
        let v = v.associate_with_to_map(|it| it + 1);
        assert_eq!(v, HashMap::from([(1, 2), (2, 3)]))
    }
}