use std::hash::Hash;
use solverforge_core::score::Score;
use crate::constraint::IncrementalQuadConstraint;
use super::collection_extract::CollectionExtract;
use super::filter::{FnPentaFilter, PentaFilter, QuadFilter};
use super::joiner::Joiner;
use super::penta_stream::PentaConstraintStream;
super::arity_stream_macros::impl_arity_stream!(
quad,
QuadConstraintStream,
QuadConstraintBuilder,
IncrementalQuadConstraint
);
impl<S, A, K, E, KE, F, Sc> QuadConstraintStream<S, A, K, E, KE, F, Sc>
where
S: Send + Sync + 'static,
A: Clone + Hash + PartialEq + Send + Sync + 'static,
K: Eq + Hash + Clone + Send + Sync,
E: CollectionExtract<S, Item = A>,
KE: Fn(&S, &A, usize) -> K + Send + Sync,
F: QuadFilter<S, A, A, A, A>,
Sc: Score + 'static,
{
pub fn join<J>(
self,
joiner: J,
) -> PentaConstraintStream<S, A, K, E, KE, impl PentaFilter<S, A, A, A, A, A>, Sc>
where
J: Joiner<A, A> + 'static,
F: 'static,
{
let filter = self.filter;
let combined_filter = move |s: &S, a: &A, b: &A, c: &A, d: &A, e: &A| {
filter.test(s, a, b, c, d) && joiner.matches(a, e)
};
PentaConstraintStream::new_self_join_with_filter(
self.extractor,
self.key_extractor,
FnPentaFilter::new(combined_filter),
)
}
}
#[cfg(doctest)]
mod doctests {
}