rspy/iterable/
for_array.rs1use std::{iter::Zip, ops::Range, slice::Iter};
2
3use crate::Iterable;
4
5impl<'a, T: 'a, const N: usize> Iterable<'a> for [T; N]
6where
7 T: Clone + Ord,
8{
9 type Item = Iter<'a, T>;
10 type SortedItems = [T; N];
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.clone();
18 result.sort();
19 result
20 }
21}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26
27 use pretty_assertions::assert_eq;
28
29 #[test]
30 fn arr_enumerate_works() {
31 let mut index_vec = vec![];
32 let mut int_vec = vec![];
33
34 let arr = [100, -100, 20, 50, -1000];
35
36 for (i, v) in arr.enumerate(-3) {
37 index_vec.push(i);
38 int_vec.push(v);
39 }
40
41 assert_eq!(index_vec, [-3, -2, -1, 0, 1]);
42 for (i, v) in arr.iter().enumerate() {
43 assert_eq!(int_vec[i], v);
44 }
45 }
46
47 #[test]
48 fn arr_enumerate_works2() {
49 let mut index_vec = vec![];
50 let mut int_vec = vec![];
51
52 let arr = [100, -100, 20, 50, -1000];
53
54 for (i, v) in arr.enumerate(3) {
55 index_vec.push(i);
56 int_vec.push(v);
57 }
58
59 assert_eq!(index_vec, [3, 4, 5, 6, 7]);
60 for (i, v) in arr.iter().enumerate() {
61 assert_eq!(int_vec[i], v);
62 }
63 }
64
65 #[test]
66 fn sorted_works() {
67 let array = [100, 20, -2000, 60, 0];
68 let result = array.sorted();
69 assert_eq!(result, [-2000, 0, 20, 60, 100]);
70 }
71}