use std::fmt::Debug;
use enumset::EnumSet;
use pumpkin_checking::CheckerVariable;
use super::TransformableVariable;
use crate::engine::Assignments;
use crate::engine::notifications::DomainEvent;
use crate::engine::notifications::OpaqueDomainEvent;
use crate::engine::notifications::Watchers;
use crate::engine::predicates::predicate_constructor::PredicateConstructor;
use crate::predicates::Predicate;
use crate::propagation::EventTarget;
pub trait IntegerVariable:
Clone
+ PredicateConstructor<Value = i32>
+ TransformableVariable<Self::AffineView>
+ Debug
+ CheckerVariable<Predicate>
+ EventTarget
{
type AffineView: IntegerVariable;
fn lower_bound(&self, assignment: &Assignments) -> i32;
fn lower_bound_at_trail_position(&self, assignment: &Assignments, trail_position: usize)
-> i32;
fn upper_bound(&self, assignment: &Assignments) -> i32;
fn upper_bound_at_trail_position(&self, assignment: &Assignments, trail_position: usize)
-> i32;
fn contains(&self, assignment: &Assignments, value: i32) -> bool;
fn contains_at_trail_position(
&self,
assignment: &Assignments,
value: i32,
trail_position: usize,
) -> bool;
fn iterate_domain(&self, assignment: &Assignments) -> impl Iterator<Item = i32>;
fn unwatch_all(&self, watchers: &mut Watchers<'_>);
fn watch_all_backtrack(&self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>);
fn unpack_event(&self, event: OpaqueDomainEvent) -> DomainEvent;
fn get_holes_at_current_checkpoint(
&self,
assignments: &Assignments,
) -> impl Iterator<Item = i32>;
fn get_holes(&self, assignments: &Assignments) -> impl Iterator<Item = i32>;
}