bilrost/
iter.rs

1//! Iterator adapters used by the crate that are not available elsewhere.
2
3/// Adapter that allows flattening an iterator of (K: Clone, V: IntoIter) into (K, V::Item).
4/// This is useful as where the type of core::iter::FlatMap cannot be named (because its function
5/// type is always anonymous), the type of FlatAdapter(..).flatten() can be named any time the type
6/// of its iterator can.
7pub 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
46/// Iterator for an individual (K: Clone, V: Iterator) that produces (K, V::Item).
47pub 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}