use crate::differences::{DiffGraph, DiffNode};
use crate::graph::NodeId;
pub(crate) fn node_name(graph: &DiffGraph, id: NodeId) -> String {
if id == graph.root {
"det".to_string()
} else {
format!("t{id}")
}
}
pub(crate) fn node_statements(graph: &DiffGraph, array: &str, by_reference: bool) -> Vec<String> {
let borrow = if by_reference { "&" } else { "" };
let name = |id: NodeId| format!("{borrow}{}", node_name(graph, id));
graph
.nodes
.iter()
.enumerate()
.map(|(id, node)| {
let value = match *node {
DiffNode::Leaf {
axis,
minuend,
subtrahend,
} => format!(
"{borrow}{array}[{minuend}][{axis}] - {borrow}{array}[{subtrahend}][{axis}]"
),
DiffNode::Neg(x) => format!("-{}", name(x)),
DiffNode::Add(x, y) => format!("{} + {}", name(x), name(y)),
DiffNode::Sub(x, y) => format!("{} - {}", name(x), name(y)),
DiffNode::Mul(x, y) => format!("{} * {}", name(x), name(y)),
};
format!("let {} = {value};", node_name(graph, id))
})
.collect()
}