rspy/iterable/
for_array.rs

1use 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}