1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::evaluator_rules::Rule;
use crate::grammar::collectors::collect_var_names;
use crate::grammar::{BinaryExpr, Expr, RcExpr};
use crate::partial_evaluator::evaluate_expr;
use crate::{InternedStr, ProgramContext};
use std::collections::HashSet;
pub enum EqRelation {
    
    AlwaysEquivalent,
    
    NeverEquivalent,
    
    DependsOn(HashSet<InternedStr>),
}
pub fn cmp_eq(
    a: &RcExpr,
    b: &RcExpr,
    evaluator_rules: &[Rule],
    context: &ProgramContext,
) -> EqRelation {
    let diff = rc_expr!(
        Expr::BinaryExpr(BinaryExpr::sub(a.clone(), b.clone())),
        crate::DUMMY_SP
    );
    let diff = evaluate_expr(diff, evaluator_rules, context);
    match diff.get_const() {
        Some(e) if e.abs() <= std::f64::EPSILON => EqRelation::AlwaysEquivalent,
        
        Some(_) => EqRelation::NeverEquivalent,
        
        None => EqRelation::DependsOn(collect_var_names(&diff)),
    }
}