use std::rc::Rc;
use crate::variables::VarId;
pub type PropagatorBox = Box<dyn Prune>;
pub type SharedPropagator = Rc<PropagatorBox>;
pub trait Prune: core::fmt::Debug {
fn prune(&self, ctx: &mut Context) -> Option<()>;
}
pub trait Propagate: Prune + 'static {
fn list_trigger_vars(&self) -> impl Iterator<Item = VarId>;
}
#[doc(hidden)]
#[derive(Clone, Debug, Default)]
pub struct Propagators {
pub state: Vec<SharedPropagator>,
pub dependencies: Vec<Vec<PropId>>,
pub propagation_steps: u64,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct PropId(pub(crate) usize);