// for the given matrix literal, return a bounded domain from the min to max of applying op to each
// For example, to find the bounds of the intervals [1,4], [1,5] combined using op, we used to do
GroundDomain::Int(ranges, _) if ranges.iter().all(Range::is_finite) => Some(ranges.clone()),
pub(super) fn division_domain(a: &Expression, b: &Expression, safe: bool) -> Option<DomainPtr> {
pub(super) fn power_integer_domain(a: &Expression, b: &Expression) -> Option<DomainPtr> {
pub(super) fn modulo_domain(a: &Expression, b: &Expression, safe: bool) -> Option<DomainPtr> {
/// [`Domain::union`] instead computes a common type envelope and intentionally drops collection
pub(super) fn mset_union_result_domain(lhs: &Expression, rhs: &Expression) -> Option<DomainPtr> {
/// Also handles permutations: `image(perm, x)` returns a value from the permutation's own inner
/// domain (a permutation's "codomain" is its domain), so this doubles as the codomain lookup for