egglog 2.0.0

egglog is a language that combines the benefits of equality saturation and datalog. It can be used for analysis, optimization, and synthesis of programs. It is the successor to the popular rust library egg.
Documentation
use egglog::*;

// This file tests the public API to terms.

#[test]
fn test_termdag_public() {
    let mut td = TermDag::default();
    let x = td.var("x".into());
    let seven = td.lit(7.into());
    let f = td.app("f".into(), vec![x, seven]);
    assert_eq!(td.to_string(f), "(f x 7)");
}

#[test]
#[should_panic]
fn test_termdag_malicious_client() {
    // here is an example of how TermIds can be misused by passing
    // them into the wrong DAG.

    let mut td = TermDag::default();
    let x = td.var("x".into());
    // at this point, td = [0 |-> x]
    // snapshot the current td
    let td2 = td.clone();
    let y = td.var("y".into());
    // now td = [0 |-> x, 1 |-> y]
    let f = td.app("f".into(), vec![x, y]);
    // f is a TermId (2) that refers to Term::App("f", [0, 1])
    assert_eq!(td.to_string(f), "(f x y)");
    // recall that td2 = [0 |-> x]
    // notice that f refers to index 1, so this crashes:
    td2.to_string(f);
}