chain_intoiter/
lib.rs

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    /// ```
11    /// use chain_intoiter::Chain;
12    /// let result = [1, 2, 3].chain(&[4, 5, 6]);
13    /// let x = result.chain(&[7, 8, 9]);
14    /// let v: Vec<isize> = x.into_iter().map(|x| *x).collect();
15    /// assert_eq!(vec!(1, 2, 3, 4, 5, 6, 7, 8, 9), v);
16    /// ```
17    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}