1use std::cmp::Ordering;
2
3#[macro_export]
4macro_rules! range_to_vec {
5 ($start:expr, $end:expr) => {{
6 ($start..$end)
7 .map(|ii| ii.to_string())
8 .collect::<Vec<String>>()
9 }};
10}
11
12#[test]
13fn range_to_string_vec() {
14 const START: i32 = 1;
15 const END: i32 = 5;
16
17 let vec_of_strings = range_to_vec!(START, END);
18
19 assert_eq!(vec_of_strings, vec!["1", "2", "3", "4"])
20}
21
22pub trait OrderedIterable<T: Ord>: Sized {
23 fn sorted(self) -> Self;
24}
25impl<T: Ord> OrderedIterable<T> for Vec<T> {
27 fn sorted(mut self) -> Self {
28 self.sort();
29 self
30 }
31}
32
33pub trait Iterable<T>: Sized {
34 fn sorted_by<F>(self, compare: F) -> Self
35 where
36 F: FnMut(&T, &T) -> Ordering;
37}
38impl<T> Iterable<T> for Vec<T> {
40 fn sorted_by<F>(mut self, compare: F) -> Self
41 where
42 F: FnMut(&T, &T) -> Ordering,
43 {
44 self.sort_by(compare);
45 self
46 }
47}
48
49#[test]
50fn sort_vecs() {
51 let vec = vec![3, 1, 4, 1, 5, 9];
52 let sorted_vec = vec.sorted();
53 assert_eq!(
54 sorted_vec,
55 vec![1, 1, 3, 4, 5, 9],
56 "Sorted vector: {:?}",
57 sorted_vec
58 );
59
60 let vec = vec!["apple", "orange", "fig"];
61 let sorted_by_length = vec.sorted_by(|a, b| a.len().cmp(&b.len()));
62 assert_eq!(
63 sorted_by_length,
64 vec!["fig", "apple", "orange"],
65 "Sorted by length: {:?}",
66 sorted_by_length
67 );
68}