rspy/iterable/
for_vec.rs

1use crate::Iterable;
2
3use std::{iter::Zip, ops::Range, slice::Iter};
4
5impl<'a, T: 'a> Iterable<'a> for Vec<T>
6where
7    T: Clone + Ord,
8{
9    type Item = Iter<'a, T>;
10    type SortedItems = Vec<T>;
11
12    fn enumerate(&'a self, start: i32) -> Zip<Range<i32>, Self::Item> {
13        (start..start + self.len() as i32).zip(self.iter())
14    }
15
16    fn sorted(&self) -> Self::SortedItems {
17        let mut result = self.to_vec();
18        result.sort();
19        result
20    }
21}
22
23impl<'a, T: 'a> Iterable<'a> for &Vec<T>
24where
25    T: Clone + Ord,
26{
27    type Item = Iter<'a, T>;
28    type SortedItems = Vec<T>;
29
30    fn enumerate(&'a self, start: i32) -> Zip<Range<i32>, Self::Item> {
31        (start..start + self.len() as i32).zip(self.iter())
32    }
33
34    fn sorted(&self) -> Self::SortedItems {
35        let mut result = self.to_vec();
36        result.sort();
37        result
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    use pretty_assertions::assert_eq;
46
47    #[test]
48    fn vec_enumerate_works() {
49        let mut index_vec = vec![];
50        let mut int_vec = vec![];
51
52        let vec = vec![100, -100, 20, 50, -1000];
53
54        for (i, v) in vec.enumerate(-3) {
55            index_vec.push(i);
56            int_vec.push(v);
57        }
58
59        assert_eq!(index_vec, [-3, -2, -1, 0, 1]);
60        for (i, v) in vec.iter().enumerate() {
61            assert_eq!(int_vec[i], v);
62        }
63    }
64
65    #[test]
66    fn vec_enumerate_works2() {
67        let mut index_vec = vec![];
68        let mut int_vec = vec![];
69
70        let vec = vec![100, -100, 20, 50, -1000];
71
72        for (i, v) in vec.enumerate(3) {
73            index_vec.push(i);
74            int_vec.push(v);
75        }
76
77        assert_eq!(index_vec, [3, 4, 5, 6, 7]);
78        for (i, v) in vec.iter().enumerate() {
79            assert_eq!(int_vec[i], v);
80        }
81    }
82
83    #[test]
84    fn sorted_works() {
85        let vec = vec![100, 20, -2000, 60, 0];
86        let result = vec.sorted();
87        assert_eq!(result, [-2000, 0, 20, 60, 100]);
88    }
89}