use crate::constraint::{ConstraintEnum, Revision};
use crate::domain::Domain;
use crate::variable::Variable;
use crate::{SolveStats, Unsatisfiable};
pub(crate) fn propagate_monotonic<D: Domain>(
variables: &mut [Variable<D>],
constraints: &[ConstraintEnum<D>],
stats: &mut SolveStats,
) -> Result<(), Unsatisfiable>
where
D::Value: PartialEq + 'static,
{
loop {
let mut changed = false;
for c in constraints {
match c.revise(variables, 0) {
Revision::Unchanged => {}
Revision::Changed => {
changed = true;
stats.propagations += 1;
}
Revision::Unsatisfiable => return Err(Unsatisfiable),
}
}
if !changed {
break;
}
}
Ok(())
}