itermore/xtraits/sorted.rs
1use core::cmp::Ordering;
2
3use alloc::vec::IntoIter;
4
5/// An extension trait that provides the [`sorted`] method and friends for
6/// iterators.
7///
8/// [`sorted`]: IterSorted::sorted
9pub trait IterSorted: Iterator {
10 /// Sorts the iterator.
11 ///
12 /// Simply collects into a [`Vec`] and sorts it using [`slice::sort`].
13 fn sorted(self) -> IntoIter<Self::Item>
14 where
15 Self: Sized,
16 Self::Item: Ord,
17 {
18 let mut v = Vec::from_iter(self);
19 v.sort();
20 v.into_iter()
21 }
22
23 /// Sorts the iterator with a comparator function.
24 ///
25 /// Simply collects into a [`Vec`] and sorts it using [`slice::sort_by`].
26 fn sorted_by<F>(self, cmp: F) -> IntoIter<Self::Item>
27 where
28 Self: Sized,
29 F: FnMut(&Self::Item, &Self::Item) -> Ordering,
30 {
31 let mut v = Vec::from_iter(self);
32 v.sort_by(cmp);
33 v.into_iter()
34 }
35
36 /// Sorts the iterator with a key extraction function.
37 ///
38 /// Simply collects into a [`Vec`] and sorts it using
39 /// [`slice::sort_by_key`].
40 fn sorted_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
41 where
42 Self: Sized,
43 K: Ord,
44 F: FnMut(&Self::Item) -> K,
45 {
46 let mut v = Vec::from_iter(self);
47 v.sort_by_key(f);
48 v.into_iter()
49 }
50
51 /// Sorts the iterator with a key extraction function.
52 ///
53 /// Simply collects into a [`Vec`] and sorts it using
54 /// [`slice::sort_by_cached_key`].
55 fn sorted_by_cached_key<K, F>(self, f: F) -> IntoIter<Self::Item>
56 where
57 Self: Sized,
58 K: Ord,
59 F: FnMut(&Self::Item) -> K,
60 {
61 let mut v = Vec::from_iter(self);
62 v.sort_by_cached_key(f);
63 v.into_iter()
64 }
65
66 /// Sorts the iterator, but might not preserve the order of equal elements.
67 ///
68 /// Simply collects into a [`Vec`] and sorts it using
69 /// [`slice::sort_unstable`].
70 fn sorted_unstable(self) -> IntoIter<Self::Item>
71 where
72 Self: Sized,
73 Self::Item: Ord,
74 {
75 let mut v = Vec::from_iter(self);
76 v.sort_unstable();
77 v.into_iter()
78 }
79
80 /// Sorts the iterator with a comparator function, but might not preserve
81 /// the order of equal elements.
82 ///
83 /// Simply collects into a [`Vec`] and sorts it using
84 /// [`slice::sort_unstable_by`].
85 fn sorted_unstable_by<F>(self, cmp: F) -> IntoIter<Self::Item>
86 where
87 Self: Sized,
88 F: FnMut(&Self::Item, &Self::Item) -> Ordering,
89 {
90 let mut v = Vec::from_iter(self);
91 v.sort_unstable_by(cmp);
92 v.into_iter()
93 }
94
95 /// Sorts the iterator with a key extraction function, but might not
96 /// preserve the order of equal elements.
97 ///
98 /// Simply collects into a [`Vec`] and sorts it using
99 /// [`slice::sort_unstable_by_key`].
100 fn sorted_unstable_by_key<K, F>(self, f: F) -> IntoIter<Self::Item>
101 where
102 Self: Sized,
103 K: Ord,
104 F: FnMut(&Self::Item) -> K,
105 {
106 let mut v = Vec::from_iter(self);
107 v.sort_unstable_by_key(f);
108 v.into_iter()
109 }
110}
111
112impl<I: ?Sized> IterSorted for I where I: Iterator {}