use std::collections::BTreeMap;

use cozo::{
    data::{
        functions::current_validity,
        program::{InputAtom, InputInlineRule, InputInlineRulesOrFixed, InputProgram, Unification},
        symb::PROG_ENTRY,
    },
    parse::{CozoScript, ImperativeStmt, ImperativeStmtClause},
    DataValue, DbInstance, Num, ScriptMutability, Symbol,
};

fn main() {
    let db = DbInstance::new("mem", "", Default::default()).unwrap();
    let sym_a = Symbol::new("a", Default::default());
    let script = CozoScript::Imperative(vec![ImperativeStmt::Program {
        prog: ImperativeStmtClause {
            prog: InputProgram {
                prog: {
                    let mut p = BTreeMap::new();
                    p.insert(
                        Symbol::new(PROG_ENTRY, Default::default()),
                        InputInlineRulesOrFixed::Rules {
                            rules: vec![InputInlineRule {
                                head: vec![sym_a.clone()],
                                aggr: vec![None],
                                body: vec![InputAtom::Unification {
                                    inner: Unification {
                                        binding: sym_a,
                                        expr: cozo::Expr::Const {
                                            val: DataValue::List(vec![
                                                DataValue::Num(Num::Int(1)),
                                                DataValue::Num(Num::Int(2)),
                                                DataValue::Num(Num::Int(3)),
                                            ]),
                                            span: Default::default(),
                                        },
                                        one_many_unif: true,
                                        span: Default::default(),
                                    },
                                }],
                                span: Default::default(),
                            }],
                        },
                    );
                    p
                },
                out_opts: Default::default(),
                disable_magic_rewrite: false,
            },
            store_as: None,
        },
    }]);
    let result = db
        .run_script_ast(script, current_validity(), ScriptMutability::Immutable)
        .unwrap();
    println!("{:?}", result);
}

Graph