greg/real/
frame.rs

1use std::ops::{
2	Range,
3	Bound,
4	RangeBounds
5};
6
7use super::{
8	Frame,
9	Point,
10	Span
11};
12
13// Constructors
14impl Frame {
15	/// Construct from a [`Range`] (i.e. `Range::new(start..stop)`)
16	///
17	/// Note that only `a..b` range syntax gives a [`Range`], so it does not work for `a..=b` or `a..` and so on.
18	pub fn new(range: Range<Point>) -> Self {
19		let Range {start, end: stop} = range;
20		Self {start, stop}
21	}
22
23	/// A [`Frame`] from `point` until `point + span`
24	pub fn from_point(point: Point, span: Span) -> Self {
25		Self {
26			start: point,
27			stop: point + span
28		}
29	}
30	/// A [`Frame`] from `point - span` until `point`
31	pub fn until_point(span: Span, point: Point) -> Self {
32		Self {
33			start: point - span,
34			stop: point
35		}
36	}
37
38	/// Get the duration of the [`Frame`] as a [`Span`]
39	///
40	/// This just does `self.stop - self.start`.
41	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}