use std::ops::{
Range,
Bound,
RangeBounds
};
use super::{
Frame,
Point,
Span
};
impl Frame {
pub fn new(range: Range<Point>) -> Self {
let Range {start, end: stop} = range;
Self {start, stop}
}
pub fn from_point(point: Point, span: Span) -> Self {
Self {
start: point,
stop: point + span
}
}
pub fn until_point(span: Span, point: Point) -> Self {
Self {
start: point - span,
stop: point
}
}
pub fn span(self) -> Span {
self.stop - self.start
}
}
impl RangeBounds<Point> for Frame {
fn start_bound(&self) -> Bound<&Point> {Bound::Included(&self.start)}
fn end_bound(&self) -> Bound<&Point> {Bound::Excluded(&self.stop)}
fn contains<U>(&self, item: &U) -> bool
where
Point: PartialOrd<U>,
U: ?Sized + PartialOrd<Point>,
{
(&self.start <= item) && (&self.stop > item)
}
}
#[test]
fn construct() {
let r = Point::from_epoch(0)..Point::now();
let f = Frame::new(r);
let ten_m = Span::from_seconds(10 * 60);
let ten_m_ago = Point::now() - ten_m;
assert!(f.contains(&ten_m_ago));
let a = Frame::from_point(ten_m_ago, ten_m);
let b = Frame::until_point(ten_m, Point::now());
assert!(a == b);
}