1use std::ops::{
2 Range,
3 Bound,
4 RangeBounds
5};
6
7use super::{
8 Frame,
9 Point,
10 Span
11};
12
13impl Frame {
15 pub fn new(range: Range<Point>) -> Self {
19 let Range {start, end: stop} = range;
20 Self {start, stop}
21 }
22
23 pub fn from_point(point: Point, span: Span) -> Self {
25 Self {
26 start: point,
27 stop: point + span
28 }
29 }
30 pub fn until_point(span: Span, point: Point) -> Self {
32 Self {
33 start: point - span,
34 stop: point
35 }
36 }
37
38 pub fn span(self) -> Span {
42 self.stop - self.start
43 }
44}
45
46impl RangeBounds<Point> for Frame {
47 fn start_bound(&self) -> Bound<&Point> {Bound::Included(&self.start)}
48 fn end_bound(&self) -> Bound<&Point> {Bound::Excluded(&self.stop)}
49 fn contains<U>(&self, item: &U) -> bool
50 where
51 Point: PartialOrd<U>,
52 U: ?Sized + PartialOrd<Point>,
53 {
54 (&self.start <= item) && (&self.stop > item)
55 }
56
57}
58
59
60#[test]
61fn construct() {
62 let r = Point::from_epoch(0)..Point::now();
63 let f = Frame::new(r);
64
65 let ten_m = Span::from_seconds(10 * 60);
66
67 let ten_m_ago = Point::now() - ten_m;
68 assert!(f.contains(&ten_m_ago));
69
70 let a = Frame::from_point(ten_m_ago, ten_m);
71 let b = Frame::until_point(ten_m, Point::now());
72
73 assert!(a == b);
74}