use crate::traits::{Coordinates, ValueBounds};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Interval<T>
where
T: ValueBounds,
{
chr: T,
start: T,
end: T,
}
impl<T> Interval<T>
where
T: ValueBounds,
{
pub fn new(start: T, end: T) -> Self {
Self {
start,
end,
chr: T::default(),
}
}
}
impl<T> Coordinates<T, T> for Interval<T>
where
T: ValueBounds,
{
fn start(&self) -> T {
self.start
}
fn end(&self) -> T {
self.end
}
fn chr(&self) -> &T {
&self.chr
}
fn update_start(&mut self, val: &T) {
self.start = *val;
}
fn update_end(&mut self, val: &T) {
self.end = *val;
}
#[allow(unused)]
fn update_chr(&mut self, val: &T) {}
fn from(other: &Self) -> Self {
Self {
start: other.start(),
end: other.end(),
chr: T::default(),
}
}
}
#[cfg(test)]
mod testing {
use crate::{traits::Coordinates, types::Interval};
#[cfg(feature = "serde")]
use bincode::{deserialize, serialize};
use std::cmp::Ordering;
#[test]
fn test_interval_init() {
let start = 10;
let end = 100;
let interval = Interval::new(start, end);
assert_eq!(interval.start(), start);
assert_eq!(interval.end(), end);
}
#[test]
fn test_interval_ordering_gt() {
let a = Interval::new(10, 100);
let b = Interval::new(5, 100);
assert_eq!(a.coord_cmp(&b), Ordering::Greater);
let a = Interval::new(10, 100);
let b = Interval::new(10, 90);
assert_eq!(a.coord_cmp(&b), Ordering::Greater);
}
#[test]
fn test_interval_ordering_lt() {
let a = Interval::new(5, 100);
let b = Interval::new(10, 100);
assert_eq!(a.coord_cmp(&b), Ordering::Less);
let a = Interval::new(5, 90);
let b = Interval::new(5, 100);
assert_eq!(a.coord_cmp(&b), Ordering::Less);
}
#[test]
fn test_interval_ordering_eq() {
let a = Interval::new(5, 100);
let b = Interval::new(5, 100);
assert_eq!(a.coord_cmp(&b), Ordering::Equal);
}
#[test]
#[cfg(feature = "serde")]
fn interval_serde() {
let a = Interval::new(5, 100);
let encoding = serialize(&a).unwrap();
let b: Interval<usize> = deserialize(&encoding).unwrap();
assert!(a.eq(&b));
}
}