use std::marker::PhantomData;
use super::Joiner;
pub fn equal<A, T, F>(key: F) -> EqualJoiner<F, F, T>
where
T: PartialEq,
F: Fn(&A) -> T + Clone + Send + Sync,
{
EqualJoiner {
left: key.clone(),
right: key,
_phantom: PhantomData,
}
}
pub fn equal_bi<A, B, T, Fa, Fb>(left: Fa, right: Fb) -> EqualJoiner<Fa, Fb, T>
where
T: PartialEq,
Fa: Fn(&A) -> T + Send + Sync,
Fb: Fn(&B) -> T + Send + Sync,
{
EqualJoiner {
left,
right,
_phantom: PhantomData,
}
}
pub struct EqualJoiner<Fa, Fb, T> {
left: Fa,
right: Fb,
_phantom: PhantomData<fn() -> T>,
}
impl<Fa, Fb, T> EqualJoiner<Fa, Fb, T> {
#[inline]
pub fn key_a<A>(&self, a: &A) -> T
where
Fa: Fn(&A) -> T,
{
(self.left)(a)
}
#[inline]
pub fn key_b<B>(&self, b: &B) -> T
where
Fb: Fn(&B) -> T,
{
(self.right)(b)
}
#[inline]
pub fn into_keys(self) -> (Fa, Fb) {
(self.left, self.right)
}
#[inline]
pub fn key_extractors(&self) -> (&Fa, &Fb) {
(&self.left, &self.right)
}
}
impl<A, B, T, Fa, Fb> Joiner<A, B> for EqualJoiner<Fa, Fb, T>
where
T: PartialEq,
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)
}
}