use crate::parts::*;
use crate::*;
use core::ops::Bound;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub(crate) enum MixMode {
Normal,
Diff,
Union,
}
impl MixMode {
pub fn min_bound<'a, T>(&self, x: Edge<&'a T>, y: Edge<&'a T>) -> Bound<&'a T>
where
T: PartialOrd,
{
let cmp = x.partial_cmp(&y).expect(msg::ORDERED);
let val = if cmp.is_le() { x } else { y };
let inc = match self {
MixMode::Diff if cmp.is_ge() => !y.is_included(),
MixMode::Union if cmp.is_eq() => x.is_included() || y.is_included(),
_ => val.is_included(),
};
val.with_included(inc).bound()
}
pub fn max_bound<'a, T>(&self, x: Edge<&'a T>, y: Edge<&'a T>) -> Bound<&'a T>
where
T: PartialOrd,
{
let cmp = x.partial_cmp(&y).expect(msg::ORDERED);
let val = if cmp.is_ge() { x } else { y };
let inc = match self {
MixMode::Diff if cmp.is_le() => !y.is_included(),
MixMode::Union if cmp.is_eq() => x.is_included() || y.is_included(),
_ => val.is_included(),
};
val.with_included(inc).bound()
}
}