Skip to content
30 changes: 22 additions & 8 deletions crates/conjure-cp-core/src/ast/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -663,14 +663,28 @@ impl Expression {
/// Returns the possible values of the expression, recursing to leaf expressions
pub fn domain_of(&self) -> Option<DomainPtr> {
match self {
Expression::Union(_, a, b) => Some(Domain::set(
SetAttr::<IntVal>::default(),
a.domain_of()?.union(&b.domain_of()?).ok()?,
)),
Expression::Intersect(_, a, b) => Some(Domain::set(
SetAttr::<IntVal>::default(),
a.domain_of()?.intersect(&b.domain_of()?).ok()?,
)),
Expression::Union(_, a, b) => {
// Ascertain range
let (a_attr, _) = a.domain_of()?.as_set()?;
let (b_attr, _) = b.domain_of()?.as_set()?;
let a_range = a_attr.resolve()?.size;
let b_range = b_attr.resolve()?.size;
let new_range = Range::spanning(&[a_range, b_range]);

// Create
Some(Domain::set(
SetAttr::new(new_range),
a.domain_of()?.union(&b.domain_of()?).ok()?,
))
}
Expression::Intersect(_, a, b) => {
// thinking about Range::overlaps?

Some(Domain::set(
SetAttr::<IntVal>::default(),
a.domain_of()?.intersect(&b.domain_of()?).ok()?,
))
}
Expression::In(_, _, _) => Some(Domain::bool()),
Expression::Supset(_, _, _) => Some(Domain::bool()),
Expression::SupsetEq(_, _, _) => Some(Domain::bool()),
Expand Down
Loading