use std::cmp::Ordering;
pub trait HeuristicObjective: Send + Sync {
type Solution;
fn total_order(&self, a: &Self::Solution, b: &Self::Solution) -> Ordering;
}
pub fn dominance_order<'a, T: 'a, Order, Iter>(a: &'a T, b: &'a T, ordering_fns: Iter) -> Ordering
where
Order: Fn(&'a T, &'a T) -> Ordering,
Iter: Iterator<Item = Order>,
{
let mut less_cnt = 0;
let mut greater_cnt = 0;
for ordering_fn in ordering_fns {
match ordering_fn(a, b) {
Ordering::Less => {
less_cnt += 1;
}
Ordering::Greater => {
greater_cnt += 1;
}
Ordering::Equal => {}
}
}
if less_cnt > 0 && greater_cnt == 0 {
Ordering::Less
} else if greater_cnt > 0 && less_cnt == 0 {
Ordering::Greater
} else {
debug_assert!((less_cnt > 0 && greater_cnt > 0) || (less_cnt == 0 && greater_cnt == 0));
Ordering::Equal
}
}