Skip to main content

solverforge_scoring/stream/
unassigned.rs

1use solverforge_core::score::Score;
2
3use super::collection_extract::CollectionExtract;
4use super::filter::{AndUniFilter, FnUniFilter, UniFilter};
5use super::UniConstraintStream;
6
7#[doc(hidden)]
8pub trait UnassignedEntity<S>: Clone + Send + Sync + 'static {
9    fn is_unassigned(solution: &S, entity: &Self) -> bool;
10}
11
12impl<S, A, E, F, Sc> UniConstraintStream<S, A, E, F, Sc>
13where
14    S: Send + Sync + 'static,
15    A: UnassignedEntity<S>,
16    E: CollectionExtract<S, Item = A>,
17    F: UniFilter<S, A>,
18    Sc: Score + 'static,
19{
20    pub fn unassigned(
21        self,
22    ) -> UniConstraintStream<S, A, E, AndUniFilter<F, FnUniFilter<fn(&S, &A) -> bool>>, Sc> {
23        let (extractor, filter) = self.into_parts();
24        UniConstraintStream::from_parts(
25            extractor,
26            AndUniFilter::new(
27                filter,
28                FnUniFilter::new(A::is_unassigned as fn(&S, &A) -> bool),
29            ),
30        )
31    }
32}