1pub struct ChainIntoIter<
2 A: IntoIterator + Copy,
3 B: IntoIterator<Item = A::Item> + Copy
4> {
5 a: A,
6 b: B,
7}
8
9pub trait Chain: IntoIterator + Copy {
10 fn chain<B: IntoIterator<Item = Self::Item> + Copy>(self, b: B) -> ChainIntoIter<Self, B> {
18 ChainIntoIter { a: self, b: b }
19 }
20}
21
22impl<T: IntoIterator + Copy> Chain for T {}
23
24impl<
25 A: IntoIterator + Copy,
26 B: IntoIterator<Item = A::Item> + Copy
27> IntoIterator for &'_ ChainIntoIter<A, B> {
28 type Item = A::Item;
29 type IntoIter = std::iter::Chain<A::IntoIter, B::IntoIter>;
30 fn into_iter(self) -> Self::IntoIter {
31 self.a.into_iter().chain(self.b.into_iter())
32 }
33}
34
35impl<A: IntoIterator + Copy, B: IntoIterator<Item = A::Item> + Copy> Copy for ChainIntoIter<A, B> {}
36
37impl<A: IntoIterator + Copy, B: IntoIterator<Item = A::Item> + Copy> Clone for ChainIntoIter<A, B> {
38 fn clone(&self) -> Self {
39 ChainIntoIter { a: self.a, b: self.b }
40 }
41}