Files
picoGraph/scripts/nodes/library/sequence.js
Max Litruv Boonzaayer e64f3e881e Initial commit
moved from private version control
2025-10-19 21:12:41 +11:00

75 lines
2.0 KiB
JavaScript

import { createNodeModule } from "../nodeTypes.js";
/**
* Executes multiple branches in sequence.
*/
export const sequenceNode = createNodeModule(
{
id: "sequence",
title: "Sequence",
category: "Logic",
description: "Execute connected branches sequentially.",
searchTags: ["sequence", "flow", "order", "multi"],
inputs: [{ id: "exec_in", name: "Exec", direction: "input", kind: "exec" }],
outputs: [
{ id: "a", name: "A", direction: "output", kind: "exec" },
{ id: "b", name: "B", direction: "output", kind: "exec" },
{ id: "c", name: "C", direction: "output", kind: "exec" },
],
properties: [],
initializeProperties: (properties) => {
if (!Array.isArray(properties.branches)) {
properties.branches = [
{ id: "a" },
{ id: "b" },
{ id: "c" },
];
} else {
properties.branches = properties.branches
.map((entry) =>
entry && typeof entry.id === "string"
? { id: entry.id.trim() || "" }
: null
)
.filter((entry) => entry && entry.id);
if (!properties.branches.length) {
properties.branches = [
{ id: "a" },
{ id: "b" },
{ id: "c" },
];
}
}
if (!Number.isFinite(properties.branchCounter)) {
properties.branchCounter = properties.branches.length;
}
},
},
{
emitExec: ({
node,
indent,
indentLevel,
findExecTargets,
emitExecChain,
path,
}) => {
const lines = [];
node.outputs.forEach((pin) => {
const label = (pin.name ?? pin.id).toLowerCase();
lines.push(`${indent(indentLevel)}-- sequence ${label}`);
const targets = findExecTargets(pin.id);
if (!targets.length) {
return;
}
targets.forEach((target) => {
const branchPath = new Set(path);
lines.push(...emitExecChain(target.nodeId, indentLevel, branchPath));
});
});
return lines;
},
}
);