use std::marker::PhantomData;
use super::Joiner;
pub fn less_than<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> LessThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
LessThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct LessThanJoiner<Fa, Fb, T> {
left: Fa,
right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
#[inline]
fn matches(&self, a: &A, b: &B) -> bool {
(self.left)(a) < (self.right)(b)
}
}
pub fn less_than_or_equal<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> LessThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
LessThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct LessThanOrEqualJoiner<Fa, Fb, T> {
left: Fa,
right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<A, B, T, Fa, Fb> Joiner<A, B> for LessThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
#[inline]
fn matches(&self, a: &A, b: &B) -> bool {
(self.left)(a) <= (self.right)(b)
}
}
pub fn greater_than<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> GreaterThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
GreaterThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct GreaterThanJoiner<Fa, Fb, T> {
left: Fa,
right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
#[inline]
fn matches(&self, a: &A, b: &B) -> bool {
(self.left)(a) > (self.right)(b)
}
}
pub fn greater_than_or_equal<A, B, T, Fa, Fb>(
left: Fa,
right: Fb,
) -> GreaterThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
GreaterThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct GreaterThanOrEqualJoiner<Fa, Fb, T> {
left: Fa,
right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<A, B, T, Fa, Fb> Joiner<A, B> for GreaterThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
#[inline]
fn matches(&self, a: &A, b: &B) -> bool {
(self.left)(a) >= (self.right)(b)
}
}