Skip to main content

allen_intervals/interval/
interval_from.rs

1use core::ops::RangeFrom;
2
3use crate::{
4    Contains, Equals, Finishes, Interval, IntervalFull, IntervalTo, Meets, NonEmpty, Overlaps,
5    Precedes, Starts,
6};
7
8/// An interval only bounded inclusively below (start..).
9///
10/// The `IntervalFrom { start }` contains all values with `x >= start`.
11#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
12pub struct IntervalFrom<T> {
13    /// The lower bound of the interval (inclusive).
14    pub start: T,
15}
16
17impl<T> From<RangeFrom<T>> for IntervalFrom<T> {
18    fn from(value: RangeFrom<T>) -> Self {
19        let RangeFrom { start } = value;
20        Self { start }
21    }
22}
23
24impl<T> From<IntervalFrom<T>> for RangeFrom<T> {
25    fn from(value: IntervalFrom<T>) -> Self {
26        let IntervalFrom { start } = value;
27        Self { start }
28    }
29}
30
31// IntervalFrom<T> vs. IntervalFull
32
33impl<T> Precedes<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
34
35impl<T> Meets<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
36
37impl<T> Overlaps<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
38
39impl<T> Starts<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
40
41impl<T> Contains<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
42
43impl<T> Finishes<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {
44    #[inline]
45    fn finishes(&self, _other: &NonEmpty<IntervalFull>) -> bool {
46        true
47    }
48}
49
50impl<T> Equals<NonEmpty<IntervalFull>> for NonEmpty<IntervalFrom<T>> {}
51
52// IntervalFrom<T> vs. IntervalTo
53
54impl<T> Precedes<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
55
56impl<T> Meets<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
57
58impl<T> Overlaps<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
59
60impl<T> Starts<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
61
62impl<T> Contains<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
63
64impl<T> Finishes<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
65
66impl<T> Equals<NonEmpty<IntervalTo<T>>> for NonEmpty<IntervalFrom<T>> {}
67
68// IntervalFrom<T> vs. IntervalFrom
69
70impl<T> Precedes<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>> {}
71
72impl<T> Meets<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>> {}
73
74impl<T> Overlaps<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>> {}
75
76impl<T> Starts<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>> {}
77
78impl<T> Contains<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>> {}
79
80impl<T> Finishes<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>>
81where
82    T: PartialOrd,
83{
84    #[inline]
85    fn finishes(&self, other: &NonEmpty<IntervalFrom<T>>) -> bool {
86        self.0.start > other.0.start
87    }
88}
89
90impl<T> Equals<NonEmpty<IntervalFrom<T>>> for NonEmpty<IntervalFrom<T>>
91where
92    T: PartialOrd,
93{
94    #[inline]
95    fn equals(&self, other: &NonEmpty<IntervalFrom<T>>) -> bool {
96        self.0.start == other.0.start
97    }
98}
99
100// IntervalFrom<T> vs. Interval
101
102impl<T> Precedes<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>> {}
103
104impl<T> Meets<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>> {}
105
106impl<T> Overlaps<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>> {}
107
108impl<T> Starts<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>> {}
109
110impl<T> Contains<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>>
111where
112    T: PartialOrd,
113{
114    #[inline]
115    fn contains(&self, other: &NonEmpty<Interval<T>>) -> bool {
116        self.0.start < other.0.start
117    }
118}
119
120impl<T> Finishes<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>>
121where
122    T: PartialOrd,
123{
124    #[inline]
125    fn finishes(&self, other: &NonEmpty<Interval<T>>) -> bool {
126        self.0.start > other.0.start
127    }
128}
129
130impl<T> Equals<NonEmpty<Interval<T>>> for NonEmpty<IntervalFrom<T>>
131where
132    T: PartialOrd,
133{
134    #[inline]
135    fn equals(&self, other: &NonEmpty<Interval<T>>) -> bool {
136        self.0.start == other.0.start
137    }
138}