Loop over a list and stop at the first match with For each (#249)
Finding the first item that matches took Count, Repeat, Item at and a Branch, and the loop could not stop once it had found something. A graph has no lambdas, so the predicate is an input that is read every round. - For each runs body once per element, with item and index set, and goes on at done. - Its break input is read anew before every round, after item is set. Once it is true the loop ends there and that round's body does not run. - done sees the matching item and index with stopped true. Without a match it sees no item, index -1 and stopped false, the OrDefault. - RepeatResult has optional items, stopWhen, stopped and exhausted. GraphInterpreter.loop reads them, Repeat runs as before. Tests: - ./check.sh: 180 files, 2623 tests, CHECK EXIT 0 - e2e GM_STEPS=1-6: ALL PASSED, 269 checks - 5 interpreter tests in graph.test.ts, 2 catalog cases - e2e 6z-iv: the palette creates the node, and a search for Name == "Gold" in Axe, Gold, Bow, Gold logs "1true" - Counter-checks: without the break check 2 unit tests fail, and with break not read over its edge 6z-iv fails - This commit alone: tsc and the three touched unit files pass (349 tests) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
a5ae21481b
commit
cb8a2d029a
8 files changed
+253
-3
No files matched your search
@@ -42,6 +42,17 @@ export interface RepeatResult {
|
||||
port: string;
|
||||
index: string;
|
||||
times: number;
|
||||
/** Round i also sets output `port` to `values[i]` – the element a `For each` is at. */
|
||||
items?: { port: string; values: readonly Value[] };
|
||||
/**
|
||||
* Boolean input read anew before every round, after the round's outputs are set. True ends the
|
||||
* loop there: that round's body does not run, and its outputs stay for what follows.
|
||||
*/
|
||||
stopWhen?: string;
|
||||
/** Boolean output telling whether `stopWhen` ended the loop. */
|
||||
stopped?: string;
|
||||
/** Outputs standing after a loop that ran through all rounds without being stopped. */
|
||||
exhausted?: Record<string, Value>;
|
||||
}
|
||||
|
||||
/** How a node asks for another behavior's graph to be run in place, `inputs` seeding its start node. */
|
||||
|
||||
Reference in new issue
Block a user