mod util;
use grabapl::operation::builder::{BuilderOpLike, OperationBuilder};
use grabapl::operation::builtin::LibBuiltinOperation;
use grabapl::operation::user_defined::AbstractNodeId;
use grabapl::prelude::*;
use util::interval_semantics::*;
#[test_log::test]
fn example() {
let op_ctx = OperationContext::<IntervalSemantics>::new();
let mut builder = OperationBuilder::new(&op_ctx, 0);
builder
.expect_parameter_node("p0", NodeType::new(0, 10))
.unwrap();
let p0 = AbstractNodeId::param("p0");
builder
.add_operation(
BuilderOpLike::Builtin(TestOperation::AddInteger(5)),
vec![p0],
)
.unwrap();
let state = builder.show_state().unwrap();
eprintln!("{}", state.graph.dot());
let resulting_type = state.node_av_of_aid(&p0).unwrap();
assert_eq!(resulting_type, &NodeType::new(5, 15));
builder
.add_named_operation(
"new".into(),
BuilderOpLike::LibBuiltin(LibBuiltinOperation::AddNode {
value: NodeValue(2),
}),
vec![],
)
.unwrap();
let new_node = AbstractNodeId::dynamic_output("new", "new");
let state = builder.show_state().unwrap();
eprintln!("{}", state.graph.dot());
let resulting_type = state.node_av_of_aid(&new_node).unwrap();
assert_eq!(resulting_type, &NodeType::new(2, 2));
}
fn recursion_fixed_point() {
let op_ctx = OperationContext::<IntervalSemantics>::new();
let mut builder = OperationBuilder::new(&op_ctx, 0);
builder
.expect_parameter_node("p0", NodeType::new(0, 100))
.unwrap();
let p0 = AbstractNodeId::param("p0");
builder
.start_query(TestQuery::ValueEqualTo(NodeValue(100)), vec![p0])
.unwrap();
builder.enter_false_branch().unwrap();
builder
.add_operation(
BuilderOpLike::Builtin(TestOperation::AddInteger(1)),
vec![p0],
)
.unwrap();
builder
.add_operation(BuilderOpLike::Recurse, vec![p0])
.unwrap();
builder.enter_true_branch().unwrap();
let op = builder.build().unwrap();
println!("Built operation: {:#?}", op.signature.output);
}