1pub struct FlatAdapter<I>(pub I);
8
9impl<I, K, Vs> Iterator for FlatAdapter<I>
10where
11 I: Iterator<Item = (K, Vs)> + Sized,
12 K: Clone,
13 Vs: IntoIterator,
14{
15 type Item = Flattening<K, Vs::IntoIter>;
16
17 fn next(&mut self) -> Option<Self::Item> {
18 self.0.next().map(|(k, v)| Flattening(k, v.into_iter()))
19 }
20}
21
22impl<I, K, Vs> ExactSizeIterator for FlatAdapter<I>
23where
24 I: ExactSizeIterator<Item = (K, Vs)> + Sized,
25 K: Clone,
26 Vs: IntoIterator,
27{
28 fn len(&self) -> usize {
29 self.0.len()
30 }
31}
32
33impl<I, K, Vs> DoubleEndedIterator for FlatAdapter<I>
34where
35 I: DoubleEndedIterator<Item = (K, Vs)> + Sized,
36 K: Clone,
37 Vs: IntoIterator,
38{
39 fn next_back(&mut self) -> Option<Self::Item> {
40 self.0
41 .next_back()
42 .map(|(k, v)| Flattening(k, v.into_iter()))
43 }
44}
45
46pub struct Flattening<K, Vi>(K, Vi);
48
49impl<K, Vi> Iterator for Flattening<K, Vi>
50where
51 K: Clone,
52 Vi: Iterator,
53{
54 type Item = (K, Vi::Item);
55
56 fn next(&mut self) -> Option<Self::Item> {
57 self.1.next().map(|v| (self.0.clone(), v))
58 }
59}
60
61impl<K, Vi> ExactSizeIterator for Flattening<K, Vi>
62where
63 K: Clone,
64 Vi: ExactSizeIterator,
65{
66 fn len(&self) -> usize {
67 self.1.len()
68 }
69}
70
71impl<K, Vi> DoubleEndedIterator for Flattening<K, Vi>
72where
73 K: Clone,
74 Vi: DoubleEndedIterator,
75{
76 fn next_back(&mut self) -> Option<Self::Item> {
77 self.1.next_back().map(|v| (self.0.clone(), v))
78 }
79}