1macro_rules! define_iter {
2 ($name:ident, $num:ident, $($case:ident),+) => {
3 #[doc = concat!("Allows ", stringify!($num), " different `Iterator` types to be merged to a single iterator type.")]
4 pub enum $name<$($case),+> {
5 $($case($case)),+
6 }
7
8 impl<Item, $($case),+> Iterator for $name<$($case),+>
9 where $($case: Iterator<Item = Item>),+ {
10 type Item = Item;
11
12 fn next(&mut self) -> Option<Self::Item> {
13 match self {
14 $(Self::$case(inner) => inner.next(),)+
15 }
16 }
17
18 fn size_hint(&self) -> (usize, Option<usize>) {
19 match self {
20 $(Self::$case(inner) => inner.size_hint(),)+
21 }
22 }
23 }
24
25 impl<Item, $($case),+> DoubleEndedIterator for $name<$($case),+>
26 where $($case: DoubleEndedIterator<Item = Item>),+ {
27 fn next_back(&mut self) -> Option<Self::Item> {
28 match self {
29 $(Self::$case(inner) => inner.next(),)+
30 }
31 }
32 }
33
34 impl<Item, $($case),+> ExactSizeIterator for $name<$($case),+>
35 where $($case: ExactSizeIterator<Item = Item>),+ {}
36 }
37}
38
39define_iter!(Iter2, two, A, B);
40define_iter!(Iter3, three, A, B, C);
41define_iter!(Iter4, four, A, B, C, D);
42define_iter!(Iter5, five, A, B, C, D, E);
43define_iter!(Iter6, six, A, B, C, D, E, F);
44define_iter!(Iter7, seven, A, B, C, D, E, F, G);
45define_iter!(Iter8, eight, A, B, C, D, E, F, G, H);
46define_iter!(Iter9, nine, A, B, C, D, E, F, G, H, I);