use std::ops::Range;
pub trait Between
where
Self: PartialEq + PartialOrd + Sized,
{
fn between(&self, left: Self, right: Self) -> bool {
*self > left && *self < right
}
fn within(&self, left: Self, right: Self) -> bool {
*self >= left && *self <= right
}
fn leftween(&self, left: Self, right: Self) -> bool {
*self >= left && *self < right
}
fn rightween(&self, left: Self, right: Self) -> bool {
*self > left && *self <= right
}
fn reorder<'a>(&'a self, right: &'a Self) -> (&'a Self, &'a Self) {
if self > right {
(right, self)
}
else {
(self, right)
}
}
fn ord_between(&self, left: Self, right: Self) -> bool {
let (left, right) = left.reorder(&right);
self > left && self < right
}
fn ord_within(&self, left: Self, right: Self) -> bool {
let (left, right) = left.reorder(&right);
self >= left && self <= right
}
fn ord_leftween(&self, left: Self, right: Self) -> bool {
let (left, right) = left.reorder(&right);
self >= left && self < right
}
fn ord_rightween(&self, left: Self, right: Self) -> bool {
let (left, right) = left.reorder(&right);
self > left && self <= right
}
}
pub trait In
where
Self: PartialEq + PartialOrd + Sized,
{
fn is_in(&self, set: &[Self]) -> bool {
if let None = set.iter().find(|&x| x == self) {
false
}
else {
true
}
}
fn in_ranges(&self, ranges: &[Range<Self>]) -> bool {
if let None = ranges.iter().find(|&x| x.contains(self)) {
false
}
else {
true
}
}
}
impl<T> Between for T where T: PartialEq + PartialOrd + Sized {}
impl<T> In for T where T: PartialEq + PartialOrd + Sized {}
#[cfg(test)]
mod tests;