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}