use eggplant::prelude::*;
use eggplant::tx_rx_vt_pr;
use serde::{Deserialize, Serialize};
#[eggplant::dsl(base=Op)]
pub enum Expr {
Const { num: i64 },
Mul { l: Expr, r: Expr },
Sub { l: Expr, r: Expr },
Add { l: Expr, r: Expr },
Div { l: Expr, r: Expr },
Binary { op: Op, l: Expr, r: Expr },
}
#[eggplant::base_ty]
#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq, Default)]
pub enum Op {
Add,
Sub,
Mul,
Div,
#[default]
Unknown,
}
tx_rx_vt_pr!(MyTx, MyPatRec);
fn main() {
env_logger::init();
let expr: Expr<MyTx, _> = Binary::new(Op::Mul, &Const::new(3), &Const::new(2));
expr.commit();
let ruleset = MyTx::new_ruleset("sss");
MyTx::add_rule(
stringify!(SubPat),
ruleset,
|| {
let l = Expr::query_leaf();
let r = Expr::query_leaf();
let p = Binary::query(&l, &r);
#[eggplant::pat_vars_catch]
struct SubPat {
l: Expr,
r: Expr,
p: Binary,
}
},
|ctx, pat| {
let s = ctx.devalue(pat.p.op);
match s {
Op::Add => todo!(),
Op::Sub => todo!(),
Op::Mul => {
let mul = ctx.insert_mul(pat.l, pat.r);
ctx.union(mul, pat.p);
}
Op::Div => todo!(),
Op::Unknown => todo!(),
}
},
);
let report = MyTx::run_ruleset(ruleset, RunConfig::Sat);
println!("{:#?}", report);
MyTx::table_view();
expr.pull();
MyTx::egraph_to_dot("egraph.dot");
MyTx::wag_to_dot("wag.dot");
MyPatRec::sgl().pats_to_dot("pats.dot");
}