funciter/
lib.rs

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}
25//
26impl<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}
38//
39impl<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}