df2dot = function(df) {
const { operators } = df;
const edges = [];
for (const operator of operators) {
if ('parent' in operator) {
edges.push({
from: operator.parent.$ref,
to: operator.id,
kind: 'parent',
label: 'parent'
});
}
for (const [key, value] of Object.entries(operator.params ?? {})) {
if (value instanceof Object && '$ref' in value) {
edges.push({
from: value.$ref,
to: operator.id,
kind: 'param',
label: key
});
}
}
}
return `digraph {
rankdir = LR;
node [style=filled];
${operators
.map(operator => {
return `${operator.id} [label="${nodeLabel(
operator
)}"; fillcolor="${nodeFillColor(operator)}"]`;
})
.join(';\n ')};
${edges
.map(edge => {
return `${edge.from} -> ${edge.to} [label="${edge.label ??
""}"; color="${edgeColor(edge)}"; weight="${edgeWeight(edge)}"]`;
})
.join(';\n ')};
}`;
}