rearrange/
lib.rs

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}