1use std::cmp::Ordering;
2
3mod iter;
4mod slice;
5
6pub use iter::RearrangeIter;
7pub use slice::Rearrange;
8
9pub struct Order<'x, T> {
10 a: &'x T,
11 b: &'x T,
12 ordering: Ordering,
13}
14
15impl<'x, T> Order<'x, T> {
16 pub fn new(a: &'x T, b: &'x T) -> Self {
17 Self {
18 a,
19 b,
20 ordering: Ordering::Equal,
21 }
22 }
23
24 pub fn by<F>(mut self, mut f: F) -> Self
25 where
26 F: FnMut(&T, &T) -> Ordering,
27 {
28 self.ordering = self.ordering.then_with(|| f(self.a, self.b));
29 self
30 }
31
32 pub fn reverse_by<F>(self, mut f: F) -> Self
33 where
34 F: FnMut(&T, &T) -> Ordering,
35 {
36 self.by(|a, b| f(a, b).reverse())
37 }
38
39 pub fn by_key<F, U>(self, mut f: F) -> Self
40 where
41 F: FnMut(&T) -> U,
42 U: Ord,
43 {
44 self.by(|a, b| f(a).cmp(&f(b)))
45 }
46
47 pub fn reverse_by_key<F, U>(self, mut f: F) -> Self
48 where
49 F: FnMut(&T) -> U,
50 U: Ord,
51 {
52 self.reverse_by(|a, b| f(a).cmp(&f(b)))
53 }
54
55 pub fn by_ref<F, U>(self, mut f: F) -> Self
56 where
57 F: FnMut(&T) -> &U,
58 U: Ord,
59 {
60 self.by(|a, b| f(a).cmp(f(b)))
61 }
62
63 pub fn reverse_by_ref<F, U>(self, mut f: F) -> Self
64 where
65 F: FnMut(&T) -> &U,
66 U: Ord,
67 {
68 self.reverse_by(|a, b| f(a).cmp(f(b)))
69 }
70
71 pub fn ordering(&self) -> Ordering {
72 self.ordering
73 }
74}