haar_lib/math/
closed_interval.rs1#[derive(Clone, Default, Debug, PartialEq, Eq)]
5pub struct ClosedInterval<T> {
6 pub start: T,
8 pub end: T,
10}
11
12impl<T> ClosedInterval<T> {
13 pub fn new(start: T, end: T) -> Self {
15 Self { start, end }
16 }
17}
18
19impl<T: Ord + PartialEq + Copy> ClosedInterval<T> {
20 pub fn merge(self, other: Self) -> Result<Self, (Self, Self)> {
24 if self.end < other.start || other.end < self.start {
25 Err((self, other))
26 } else {
27 Ok(Self {
28 start: self.start.min(other.start),
29 end: self.end.max(other.end),
30 })
31 }
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use super::*;
38
39 #[test]
40 fn test() {
41 type I = ClosedInterval<i64>;
42
43 assert_eq!(
44 I::new(0, 3).merge(I::new(4, 7)),
45 Err((I::new(0, 3), I::new(4, 7)))
46 );
47 assert_eq!(I::new(0, 3).merge(I::new(3, 6)), Ok(I::new(0, 6)));
48 assert_eq!(I::new(0, 3).merge(I::new(-2, 5)), Ok(I::new(-2, 5)));
49 assert_eq!(I::new(0, 3).merge(I::new(-2, 2)), Ok(I::new(-2, 3)));
50 assert_eq!(I::new(0, 3).merge(I::new(1, 2)), Ok(I::new(0, 3)));
51 }
52}