use std::marker::PhantomData;
use super::Joiner;
pub fn less_than<T, Fa, Fb>(left: Fa, right: Fb) -> LessThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Send + Sync,
Fb: Send + Sync,
{
LessThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub fn less_than_on<T, LK, KC>(left: LK, right: KC) -> LessThanJoiner<LK, KC, T>
where
T: Ord,
LK: Send + Sync,
KC: Send + Sync,
{
LessThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct LessThanJoiner<Fa, Fb, T> {
pub(super) left: Fa,
pub(super) right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<Fa, Fb, T> LessThanJoiner<Fa, Fb, T> {
pub fn and<J>(self, other: J) -> super::AndJoiner<Self, J> {
super::AndJoiner {
first: self,
second: other,
}
}
#[inline]
pub fn into_keys(self) -> (Fa, Fb) {
(self.left, self.right)
}
}
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<T, Fa, Fb>(left: Fa, right: Fb) -> LessThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Send + Sync,
Fb: Send + Sync,
{
LessThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub fn less_than_or_equal_on<T, LK, KC>(left: LK, right: KC) -> LessThanOrEqualJoiner<LK, KC, T>
where
T: Ord,
LK: Send + Sync,
KC: Send + Sync,
{
LessThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct LessThanOrEqualJoiner<Fa, Fb, T> {
pub(super) left: Fa,
pub(super) right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<Fa, Fb, T> LessThanOrEqualJoiner<Fa, Fb, T> {
pub fn and<J>(self, other: J) -> super::AndJoiner<Self, J> {
super::AndJoiner {
first: self,
second: other,
}
}
#[inline]
pub fn into_keys(self) -> (Fa, Fb) {
(self.left, self.right)
}
}
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<T, Fa, Fb>(left: Fa, right: Fb) -> GreaterThanJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Send + Sync,
Fb: Send + Sync,
{
GreaterThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub fn greater_than_on<T, LK, KC>(left: LK, right: KC) -> GreaterThanJoiner<LK, KC, T>
where
T: Ord,
LK: Send + Sync,
KC: Send + Sync,
{
GreaterThanJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct GreaterThanJoiner<Fa, Fb, T> {
pub(super) left: Fa,
pub(super) right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<Fa, Fb, T> GreaterThanJoiner<Fa, Fb, T> {
pub fn and<J>(self, other: J) -> super::AndJoiner<Self, J> {
super::AndJoiner {
first: self,
second: other,
}
}
#[inline]
pub fn into_keys(self) -> (Fa, Fb) {
(self.left, self.right)
}
}
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<T, Fa, Fb>(left: Fa, right: Fb) -> GreaterThanOrEqualJoiner<Fa, Fb, T>
where
T: Ord,
Fa: Send + Sync,
Fb: Send + Sync,
{
GreaterThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub fn greater_than_or_equal_on<T, LK, KC>(
left: LK,
right: KC,
) -> GreaterThanOrEqualJoiner<LK, KC, T>
where
T: Ord,
LK: Send + Sync,
KC: Send + Sync,
{
GreaterThanOrEqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct GreaterThanOrEqualJoiner<Fa, Fb, T> {
pub(super) left: Fa,
pub(super) right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<Fa, Fb, T> GreaterThanOrEqualJoiner<Fa, Fb, T> {
pub fn and<J>(self, other: J) -> super::AndJoiner<Self, J> {
super::AndJoiner {
first: self,
second: other,
}
}
#[inline]
pub fn into_keys(self) -> (Fa, Fb) {
(self.left, self.right)
}
}
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)
}
}