use std::marker::PhantomData;
use super::Joiner;
pub fn overlapping<A, B, T, Fsa, Fea, Fsb, Feb>(
start_a: Fsa,
end_a: Fea,
start_b: Fsb,
end_b: Feb,
) -> OverlappingJoiner<Fsa, Fea, Fsb, Feb, T>
where
T: Ord,
Fsa: Fn(&A) -> T + Send + Sync,
Fea: Fn(&A) -> T + Send + Sync,
Fsb: Fn(&B) -> T + Send + Sync,
Feb: Fn(&B) -> T + Send + Sync,
{
OverlappingJoiner {
start_a,
end_a,
start_b,
end_b,
_phantom: PhantomData,
}
}
pub struct OverlappingJoiner<Fsa, Fea, Fsb, Feb, T> {
start_a: Fsa,
end_a: Fea,
start_b: Fsb,
end_b: Feb,
_phantom: PhantomData<fn() -> T>,
}
impl<A, B, T, Fsa, Fea, Fsb, Feb> Joiner<A, B> for OverlappingJoiner<Fsa, Fea, Fsb, Feb, T>
where
T: Ord,
Fsa: Fn(&A) -> T + Send + Sync,
Fea: Fn(&A) -> T + Send + Sync,
Fsb: Fn(&B) -> T + Send + Sync,
Feb: Fn(&B) -> T + Send + Sync,
{
#[inline]
fn matches(&self, a: &A, b: &B) -> bool {
let start_a = (self.start_a)(a);
let end_a = (self.end_a)(a);
let start_b = (self.start_b)(b);
let end_b = (self.end_b)(b);
start_a < end_b && start_b < end_a
}
}