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>
32where
33 T: Ord,
34 Fa: Fn(&A) -> T + Send + Sync,
35 Fb: Fn(&B) -> T + Send + Sync,
36{
37 LessThanJoiner {
38 left,
39 right,
40 _phantom: PhantomData,
41 }
42}
43
44pub struct LessThanJoiner<Fa, Fb, T> {
46 left: Fa,
47 right: Fb,
48 _phantom: PhantomData<fn() -> T>,
49}
50
51impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanJoiner<Fa, Fb, T>
52where
53 T: Ord,
54 Fa: Fn(&A) -> T + Send + Sync,
55 Fb: Fn(&B) -> T + Send + Sync,
56{
57 #[inline]
58 fn matches(&self, a: &A, b: &B) -> bool {
59 (self.left)(a) < (self.right)(b)
60 }
61}
62
63pub fn less_than_or_equal<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> LessThanOrEqualJoiner<Fa, Fb, T>
78where
79 T: Ord,
80 Fa: Fn(&A) -> T + Send + Sync,
81 Fb: Fn(&B) -> T + Send + Sync,
82{
83 LessThanOrEqualJoiner {
84 left,
85 right,
86 _phantom: PhantomData,
87 }
88}
89
90pub struct LessThanOrEqualJoiner<Fa, Fb, T> {
92 left: Fa,
93 right: Fb,
94 _phantom: PhantomData<fn() -> T>,
95}
96
97impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanOrEqualJoiner<Fa, Fb, T>
98where
99 T: Ord,
100 Fa: Fn(&A) -> T + Send + Sync,
101 Fb: Fn(&B) -> T + Send + Sync,
102{
103 #[inline]
104 fn matches(&self, a: &A, b: &B) -> bool {
105 (self.left)(a) <= (self.right)(b)
106 }
107}
108
109pub fn greater_than<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> GreaterThanJoiner<Fa, Fb, T>
124where
125 T: Ord,
126 Fa: Fn(&A) -> T + Send + Sync,
127 Fb: Fn(&B) -> T + Send + Sync,
128{
129 GreaterThanJoiner {
130 left,
131 right,
132 _phantom: PhantomData,
133 }
134}
135
136pub struct GreaterThanJoiner<Fa, Fb, T> {
138 left: Fa,
139 right: Fb,
140 _phantom: PhantomData<fn() -> T>,
141}
142
143impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanJoiner<Fa, Fb, T>
144where
145 T: Ord,
146 Fa: Fn(&A) -> T + Send + Sync,
147 Fb: Fn(&B) -> T + Send + Sync,
148{
149 #[inline]
150 fn matches(&self, a: &A, b: &B) -> bool {
151 (self.left)(a) > (self.right)(b)
152 }
153}
154
155pub fn greater_than_or_equal<A, B, T, Fa, Fb>(
170 left: Fa,
171 right: Fb,
172) -> GreaterThanOrEqualJoiner<Fa, Fb, T>
173where
174 T: Ord,
175 Fa: Fn(&A) -> T + Send + Sync,
176 Fb: Fn(&B) -> T + Send + Sync,
177{
178 GreaterThanOrEqualJoiner {
179 left,
180 right,
181 _phantom: PhantomData,
182 }
183}
184
185pub struct GreaterThanOrEqualJoiner<Fa, Fb, T> {
187 left: Fa,
188 right: Fb,
189 _phantom: PhantomData<fn() -> T>,
190}
191
192impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanOrEqualJoiner<Fa, Fb, T>
193where
194 T: Ord,
195 Fa: Fn(&A) -> T + Send + Sync,
196 Fb: Fn(&B) -> T + Send + Sync,
197{
198 #[inline]
199 fn matches(&self, a: &A, b: &B) -> bool {
200 (self.left)(a) >= (self.right)(b)
201 }
202}