rs_std_ext/vec.rs
1//! [`std::vec::Vec`] related extensions.
2
3use std::cmp::Ordering;
4
5/// Extension methods for [`std::vec::Vec`].
6pub trait VecExt<T> {
7 /// Same behaviour as [`Vec::sort`][vec_sort],
8 /// but returns itself in a form consistent with chained calls.
9 ///
10 /// [vec_sort]: std::vec::Vec#method.sort
11 fn sorted(self) -> Self
12 where
13 T: Ord;
14
15 /// Same behaviour as [`Vec::sort_by`][vec_sort_by],
16 /// but returns itself in a form consistent with chained calls.
17 ///
18 /// [vec_sort_by]: std::vec::Vec#method.sort_by
19 fn sorted_by(self, compare: impl FnMut(&T, &T) -> Ordering) -> Self;
20
21 /// Same behaviour as [`Vec::sort_by_key`][vec_sort_by_key],
22 /// but returns itself in a form consistent with chained calls.
23 ///
24 /// [vec_sort_by_key]: std::vec::Vec#method.sort_by_key
25 fn sorted_by_key<K>(self, f: impl FnMut(&T) -> K) -> Self
26 where
27 K: Ord;
28
29 /// Same behaviour as [`Vec::sort_by_cached_key`][vec_sort_by_cached_key],
30 /// but returns itself in a form consistent with chained calls.
31 ///
32 /// [vec_sort_by_cached_key]: std::vec::Vec#method.sort_by_cached_key
33 fn sorted_by_cached_key<K>(self, f: impl FnMut(&T) -> K) -> Self
34 where
35 K: Ord;
36
37 /// Same behaviour as [`Vec::sort_unstable`][vec_sort_unstable],
38 /// but returns itself in a form consistent with chained calls.
39 ///
40 /// [vec_sort_unstable]: std::vec::Vec#method.sort_unstable
41 fn sorted_unstable(self) -> Self
42 where
43 T: Ord;
44
45 /// Same behaviour as [`Vec::sort_unstable_by`][vec_sort_unstable_by],
46 /// but returns itself in a form consistent with chained calls.
47 ///
48 /// [vec_sort_unstable_by]: std::vec::Vec#method.sort_unstable_by
49 fn sorted_unstable_by(self, compare: impl FnMut(&T, &T) -> Ordering) -> Self;
50
51 /// Same behaviour as [`Vec::sort_unstable_by_key`][vec_sort_unstable_by_key],
52 /// but returns itself in a form consistent with chained calls.
53 ///
54 /// [vec_sort_unstable_by_key]: std::vec::Vec#method.sort_unstable_by_key
55 fn sorted_unstable_by_key<K>(self, f: impl FnMut(&T) -> K) -> Self
56 where
57 K: Ord;
58
59 /// Same behaviour as [`Vec::reverse`][vec_reverse],
60 /// but returns itself in a form consistent with chained calls.
61 ///
62 /// [vec_reverse]: std::vec::Vec#method.reverse
63 fn reversed(self) -> Self;
64}
65
66impl<T> VecExt<T> for Vec<T> {
67 fn sorted(mut self) -> Self
68 where
69 T: Ord,
70 {
71 self.sort();
72 self
73 }
74
75 fn sorted_by(mut self, compare: impl FnMut(&T, &T) -> Ordering) -> Self {
76 self.sort_by(compare);
77 self
78 }
79
80 fn sorted_by_key<K>(mut self, f: impl FnMut(&T) -> K) -> Self
81 where
82 K: Ord,
83 {
84 self.sort_by_key(f);
85 self
86 }
87
88 fn sorted_by_cached_key<K>(mut self, f: impl FnMut(&T) -> K) -> Self
89 where
90 K: Ord,
91 {
92 self.sort_by_cached_key(f);
93 self
94 }
95
96 fn sorted_unstable(mut self) -> Self
97 where
98 T: Ord,
99 {
100 self.sort_unstable();
101 self
102 }
103
104 fn sorted_unstable_by(mut self, compare: impl FnMut(&T, &T) -> Ordering) -> Self {
105 self.sort_unstable_by(compare);
106 self
107 }
108
109 fn sorted_unstable_by_key<K>(mut self, f: impl FnMut(&T) -> K) -> Self
110 where
111 K: Ord,
112 {
113 self.sort_unstable_by_key(f);
114 self
115 }
116
117 fn reversed(mut self) -> Self {
118 self.reverse();
119 self
120 }
121}