rev/
lib.rs

1pub struct RevIntoIter<T: IntoIterator + Copy>
2    where T::IntoIter: DoubleEndedIterator
3{
4    original: T
5}
6
7pub trait Rev: IntoIterator + Copy
8    where Self::IntoIter: DoubleEndedIterator
9{
10    /// ```
11    /// use rev::Rev;
12    /// let a = [1, 2, 3];
13    /// let x = a.rev();
14    /// let d: Vec<i32> = x.into_iter().map(|&x| x).collect();
15    /// assert_eq!(d, vec!(3, 2, 1));
16    /// ```
17    fn rev(self) -> RevIntoIter<Self> {
18        RevIntoIter { original: self }
19    }
20}
21
22impl<T: IntoIterator + Copy> Rev for T
23    where T::IntoIter: DoubleEndedIterator
24{
25}
26
27impl<T: IntoIterator + Copy> IntoIterator for RevIntoIter<T>
28    where T::IntoIter: DoubleEndedIterator
29{
30    type Item = T::Item;
31    type IntoIter = std::iter::Rev<T::IntoIter>;
32    fn into_iter(self) -> Self::IntoIter {
33        self.original.into_iter().rev()
34    }
35}
36
37impl<T: IntoIterator + Copy> Copy for RevIntoIter<T>
38    where T::IntoIter: DoubleEndedIterator
39{
40}
41
42impl<T: IntoIterator + Copy> Clone for RevIntoIter<T>
43    where T::IntoIter: DoubleEndedIterator
44{
45    fn clone(&self) -> Self {
46        Self { original: self.original }
47    }
48}