veho/hashmap/
mappers.rs

1use std::collections::HashMap;
2use std::hash::Hash;
3
4pub trait Mappers<K, V>: IntoIterator<Item=(K, V)> where K: Hash + Eq
5{
6    fn mapper<KT, VT, F>(self, mut f: F) -> HashMap<KT, VT> where
7        Self: Sized,
8        F: FnMut(K, V) -> (KT, VT),
9        KT: Hash + Eq
10    { self.into_iter().map(|(k, v)| f(k, v)).collect::<HashMap<KT, VT>>() }
11
12    fn iterate<F>(self, mut f: F) where
13        Self: Sized,
14        F: FnMut(K, V)
15    { self.into_iter().for_each(|(k, v)| f(k, v)) }
16
17    fn mapper_key<KT, F>(self, mut f: F) -> HashMap<KT, V> where
18        Self: Sized,
19        F: FnMut(K) -> KT,
20        KT: Hash + Eq
21    { self.into_iter().map(|(k, v)| (f(k), v)).collect::<HashMap<KT, V>>() }
22
23    fn iterate_key<F>(self, mut f: F) where
24        Self: Sized,
25        F: FnMut(K)
26    { self.into_iter().for_each(|(k, _)| f(k)) }
27
28    fn mapper_value<VT, F>(self, mut f: F) -> HashMap<K, VT> where
29        Self: Sized,
30        F: FnMut(V) -> VT,
31    { self.into_iter().map(|(k, v)| (k, f(v))).collect::<HashMap<K, VT>>() }
32
33    fn iterate_value<F>(self, mut f: F) where
34        Self: Sized,
35        F: FnMut(V)
36    { self.into_iter().for_each(|(_, v)| f(v)) }
37}
38
39impl<K, V, KVS: ?Sized> Mappers<K, V> for KVS where
40    K: Hash + Eq,
41    KVS: IntoIterator<Item=(K, V)> {}
42
43pub fn mapper<K, V, KVS, KT, VT, F>(kvp: KVS, f: F) -> HashMap<KT, VT> where
44    K: Hash + Eq,
45    KVS: IntoIterator<Item=(K, V)>,
46    F: FnMut(K, V) -> (KT, VT),
47    KT: Hash + Eq
48{ kvp.mapper(f) }
49
50pub fn iterate<K, V, KVS, F>(kvp: KVS, f: F) where
51    K: Hash + Eq,
52    KVS: IntoIterator<Item=(K, V)>,
53    F: FnMut(K, V)
54{ kvp.iterate(f) }
55
56pub fn mapper_key<K, V, KVS, KT, F>(kvp: KVS, f: F) -> HashMap<KT, V> where
57    K: Hash + Eq,
58    KVS: IntoIterator<Item=(K, V)>,
59    F: FnMut(K) -> KT,
60    KT: Hash + Eq
61{ kvp.mapper_key(f) }
62
63pub fn iterate_key<K, V, KVS, F>(kvp: KVS, f: F) where
64    K: Hash + Eq,
65    KVS: IntoIterator<Item=(K, V)>,
66    F: FnMut(K)
67{ kvp.iterate_key(f) }
68
69pub fn mapper_value<K, V, KVS, VT, F>(kvp: KVS, f: F) -> HashMap<K, VT> where
70    K: Hash + Eq,
71    KVS: IntoIterator<Item=(K, V)>,
72    F: FnMut(V) -> VT,
73{ kvp.mapper_value(f) }
74
75pub fn iterate_value<K, V, KVS, F>(kvp: KVS, f: F) where
76    K: Hash + Eq,
77    KVS: IntoIterator<Item=(K, V)>,
78    F: FnMut(V)
79{ kvp.iterate_value(f) }
80
81
82#[cfg(test)]
83mod hashmap_mappers_tests {
84    use crate::entries::IntoHashmap;
85    use crate::hashmap::mappers::Mappers;
86
87    #[test]
88    fn test_mapper() {
89        let alpha = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
90        println!(">> alpha = {:?}", alpha);
91        let beta = (&alpha).mapper(|k, v| (k, v + 1));
92        println!(">> beta = {:?}", beta);
93        println!(">> alpha = {:?}", alpha);
94    }
95
96    #[test]
97    fn test_iterate_mutate() {
98        let mut dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
99        println!(">> {:?}", dict);
100        (&mut dict).iterate(|_, v| { *v += 1; });
101        println!(">> {:?}", dict);
102    }
103
104    #[test]
105    fn test_mapper_value() {
106        let dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
107        println!(">> {:?}", dict);
108        let dict = dict.mapper_value(|v| v + 1);
109        println!(">> {:?}", dict);
110    }
111
112    #[test]
113    fn test_iterate_value() {
114        let mut dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
115        println!(">> {:?}", dict);
116        (&mut dict).iterate_value(|v| { *v += 1; });
117        println!(">> {:?}", dict);
118    }
119}
120
121#[cfg(test)]
122mod hashmap_mappers_func_tests {
123    use crate::entries::IntoHashmap;
124    use crate::hashmap::{iterate, iterate_value, mapper, mapper_value};
125
126    #[test]
127    fn test_mapper() {
128        let alpha = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
129        println!(">> alpha = {:?}", alpha);
130        let beta = mapper(&alpha, |k, v| (k, v + 1));
131        println!(">> beta = {:?}", beta);
132        println!(">> alpha = {:?}", alpha);
133    }
134
135    #[test]
136    fn test_iterate_mutate() {
137        let mut dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
138        println!(">> {:?}", dict);
139        iterate(&mut dict, |_, v| { *v += 1; });
140        println!(">> {:?}", dict);
141    }
142
143    #[test]
144    fn test_mapper_value() {
145        let dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
146        println!(">> {:?}", dict);
147        let dict = mapper_value(dict, |v| v + 1);
148        println!(">> {:?}", dict);
149    }
150
151    #[test]
152    fn test_iterate_value() {
153        let mut dict = vec![("foo", 1), ("bar", 2), ("zen", 3)].into_hashmap();
154        println!(">> {:?}", dict);
155        iterate_value(&mut dict, |v| { *v += 1; });
156        println!(">> {:?}", dict);
157    }
158}