pub trait BetterThanOperator { fn better_than(self: &Self, a: &T, b: &T) -> bool; fn equal(self: &Self, a: &T, b: &T) -> bool; fn ordering(&self, a: &T, b: &T) -> std::cmp::Ordering { if self.equal(a, b) { std::cmp::Ordering::Equal } else if self.better_than(a, b) { std::cmp::Ordering::Less } else { std::cmp::Ordering::Greater } } } pub struct MinimizingOperator; impl MinimizingOperator { pub fn new() -> Self { Self } } impl BetterThanOperator for MinimizingOperator where T: PartialOrd { fn better_than(self: &Self, a: &T, b: &T) -> bool { a < b } fn equal(self: &Self, a: &T, b: &T) -> bool { *a == *b } } pub struct MaximizingOperator; impl MaximizingOperator { pub fn new() -> Self { Self } } impl BetterThanOperator for MaximizingOperator where T: PartialOrd { fn better_than(self: &Self, a: &T, b: &T) -> bool { a > b } fn equal(self: &Self, a: &T, b: &T) -> bool { *a == *b } }