solverforge_scoring/stream/joiner/
comparison.rs1use std::marker::PhantomData;
4
5use super::Joiner;
6
7pub fn less_than<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> LessThanJoiner<Fa, Fb, T>
31where
32 T: Ord,
33 Fa: Fn(&A) -> T + Send + Sync,
34 Fb: Fn(&B) -> T + Send + Sync,
35{
36 LessThanJoiner {
37 left,
38 right,
39 _phantom: PhantomData,
40 }
41}
42
43pub struct LessThanJoiner<Fa, Fb, T> {
45 left: Fa,
46 right: Fb,
47 _phantom: PhantomData<fn() -> T>,
48}
49
50impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanJoiner<Fa, Fb, T>
51where
52 T: Ord,
53 Fa: Fn(&A) -> T + Send + Sync,
54 Fb: Fn(&B) -> T + Send + Sync,
55{
56 #[inline]
57 fn matches(&self, a: &A, b: &B) -> bool {
58 (self.left)(a) < (self.right)(b)
59 }
60}
61
62pub fn less_than_or_equal<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> LessThanOrEqualJoiner<Fa, Fb, T>
76where
77 T: Ord,
78 Fa: Fn(&A) -> T + Send + Sync,
79 Fb: Fn(&B) -> T + Send + Sync,
80{
81 LessThanOrEqualJoiner {
82 left,
83 right,
84 _phantom: PhantomData,
85 }
86}
87
88pub struct LessThanOrEqualJoiner<Fa, Fb, T> {
90 left: Fa,
91 right: Fb,
92 _phantom: PhantomData<fn() -> T>,
93}
94
95impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanOrEqualJoiner<Fa, Fb, T>
96where
97 T: Ord,
98 Fa: Fn(&A) -> T + Send + Sync,
99 Fb: Fn(&B) -> T + Send + Sync,
100{
101 #[inline]
102 fn matches(&self, a: &A, b: &B) -> bool {
103 (self.left)(a) <= (self.right)(b)
104 }
105}
106
107pub fn greater_than<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> GreaterThanJoiner<Fa, Fb, T>
121where
122 T: Ord,
123 Fa: Fn(&A) -> T + Send + Sync,
124 Fb: Fn(&B) -> T + Send + Sync,
125{
126 GreaterThanJoiner {
127 left,
128 right,
129 _phantom: PhantomData,
130 }
131}
132
133pub struct GreaterThanJoiner<Fa, Fb, T> {
135 left: Fa,
136 right: Fb,
137 _phantom: PhantomData<fn() -> T>,
138}
139
140impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanJoiner<Fa, Fb, T>
141where
142 T: Ord,
143 Fa: Fn(&A) -> T + Send + Sync,
144 Fb: Fn(&B) -> T + Send + Sync,
145{
146 #[inline]
147 fn matches(&self, a: &A, b: &B) -> bool {
148 (self.left)(a) > (self.right)(b)
149 }
150}
151
152pub fn greater_than_or_equal<A, B, T, Fa, Fb>(
166 left: Fa,
167 right: Fb,
168) -> GreaterThanOrEqualJoiner<Fa, Fb, T>
169where
170 T: Ord,
171 Fa: Fn(&A) -> T + Send + Sync,
172 Fb: Fn(&B) -> T + Send + Sync,
173{
174 GreaterThanOrEqualJoiner {
175 left,
176 right,
177 _phantom: PhantomData,
178 }
179}
180
181pub struct GreaterThanOrEqualJoiner<Fa, Fb, T> {
183 left: Fa,
184 right: Fb,
185 _phantom: PhantomData<fn() -> T>,
186}
187
188impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanOrEqualJoiner<Fa, Fb, T>
189where
190 T: Ord,
191 Fa: Fn(&A) -> T + Send + Sync,
192 Fb: Fn(&B) -> T + Send + Sync,
193{
194 #[inline]
195 fn matches(&self, a: &A, b: &B) -> bool {
196 (self.left)(a) >= (self.right)(b)
197 }
198}