allen_intervals/interval/
interval_from.rs1use core::ops::RangeFrom;
2
3use crate::{
4 Contains, Equals, Finishes, Interval, IntervalFull, IntervalTo, Meets, NonEmpty, Overlaps,
5 Precedes, Starts,
6};
7
8#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
12pub struct IntervalFrom<T> {
13 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
31impl<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
52impl<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
68impl<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
100impl<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}