use crate::ops::Located;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Region<C> {
start: C,
end: C,
}
impl<C> Region<C>
where
C: PartialOrd,
{
pub fn new(start: C, end: C) -> Option<Self> {
if start > end {
None
} else {
Some(Self { start, end })
}
}
}
impl<C> Located<C> for Region<C> {
fn start(&self) -> &C {
&self.start
}
fn end(&self) -> &C {
&self.end
}
}
#[cfg(test)]
mod test {
use crate::ops::{Contains, Located, Overlaps, Spanning};
use crate::Region;
use rstest::rstest;
#[rstest]
#[case(1, 5)]
fn test_region_methods(#[case] start: u8, #[case] end: u8) {
let region = Region::new(start, end).unwrap();
let region_other = Region::new(2, 6).unwrap();
assert_eq!(*region.start(), 1);
assert_eq!(*region.end(), 5);
let (start_coor, end_coor) = region.coordinates();
assert_eq!(*start_coor, 1);
assert_eq!(*end_coor, 5);
assert_eq!(region.contains(®ion_other), false);
assert_eq!(region.overlaps(®ion_other), true);
assert_eq!(region.span(), 4);
assert_eq!(region.is_empty(), false);
}
}