mirror of
https://github.com/litruv/picoGraph.git
synced 2026-07-24 02:36:04 +10:00
Initial commit
moved from private version control
This commit is contained in:
92
scripts/nodes/library/forLoop.js
Normal file
92
scripts/nodes/library/forLoop.js
Normal file
@@ -0,0 +1,92 @@
|
||||
import { createNodeModule } from "../nodeTypes.js";
|
||||
|
||||
/**
|
||||
* Iterates from start to end inclusive using PICO-8 for semantics.
|
||||
*/
|
||||
export const forLoopNode = createNodeModule(
|
||||
{
|
||||
id: "for_loop",
|
||||
title: "For Loop",
|
||||
category: "Logic",
|
||||
description:
|
||||
"Iterate from start to end inclusive using PICO-8 for semantics.",
|
||||
searchTags: ["loop", "for", "iterate", "counter"],
|
||||
inputs: [
|
||||
{ id: "exec_in", name: "Exec", direction: "input", kind: "exec" },
|
||||
{
|
||||
id: "start",
|
||||
name: "Start",
|
||||
direction: "input",
|
||||
kind: "number",
|
||||
defaultValue: 0,
|
||||
},
|
||||
{
|
||||
id: "end",
|
||||
name: "End",
|
||||
direction: "input",
|
||||
kind: "number",
|
||||
defaultValue: 10,
|
||||
},
|
||||
{
|
||||
id: "step",
|
||||
name: "Step",
|
||||
direction: "input",
|
||||
kind: "number",
|
||||
defaultValue: 1,
|
||||
},
|
||||
],
|
||||
outputs: [
|
||||
{ id: "loop", name: "Loop", direction: "output", kind: "exec" },
|
||||
{ id: "completed", name: "Completed", direction: "output", kind: "exec" },
|
||||
],
|
||||
properties: [
|
||||
{
|
||||
key: "index",
|
||||
label: "Index Variable",
|
||||
type: "string",
|
||||
defaultValue: "i",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
emitExec: ({
|
||||
node,
|
||||
indent,
|
||||
indentLevel,
|
||||
resolveValueInput,
|
||||
sanitizeIdentifier,
|
||||
emitBranch,
|
||||
path,
|
||||
}) => {
|
||||
const index = sanitizeIdentifier(String(node.properties.index ?? "i"));
|
||||
const startValue = resolveValueInput("start", "0");
|
||||
const endValue = resolveValueInput("end", "0");
|
||||
const stepValue = resolveValueInput("step", "1");
|
||||
|
||||
const lines = [
|
||||
`${indent(
|
||||
indentLevel
|
||||
)}for ${index} = ${startValue}, ${endValue}, ${stepValue} do`,
|
||||
];
|
||||
|
||||
const loopLines = emitBranch("loop", {
|
||||
indentLevel: indentLevel + 1,
|
||||
path: new Set(path),
|
||||
});
|
||||
if (!loopLines.length) {
|
||||
lines.push(`${indent(indentLevel + 1)}-- loop body`);
|
||||
} else {
|
||||
lines.push(...loopLines);
|
||||
}
|
||||
|
||||
lines.push(`${indent(indentLevel)}end`);
|
||||
lines.push(
|
||||
...emitBranch("completed", {
|
||||
indentLevel,
|
||||
path,
|
||||
})
|
||||
);
|
||||
return lines;
|
||||
},
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user