itern/
lib.rs

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);