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}