First not empty: Schalter, was als leer zählt #206

Closed
opened 2026-09-22 20:12:30 +02:00 by meleki · 2 comments
Owner

Der Node First not empty (#205) bekommt einen Parameter, der festlegt, was als leer gilt.

Der Schalter

(Entscheidung im Chat, 2026-09-22)

  • Aus (Vorgabe, wie heute): Leerwert jeder Art zählt als leer — nichts verbunden bzw. kein Objekt, 0, "", false, leere Liste, Struct mit nur leeren Feldern.
  • Ein: Nur „wirklich nichts" zählt als leer. 0, false und ein leerer Text sind dann echte Werte und werden durchgereicht.

Die Vorgabe ist Aus, bestehende Graphen verhalten sich also unverändert.

Warum

Bei Zahlen ist „0 ist leer" irgendwann im Weg: 0 Schaden, 0 Geschwindigkeit oder false als Schalter sind echte Werte, die nicht überschrieben werden sollen.

Befund, der die Entscheidung unten betrifft

Der Anlassfall aus dem Chat (Behavior-Parameter Animation mit Variable als Rückfall) funktioniert nur, weil eine Animation als Text reist (kinds.ts, travels: 'string', empty: '') und ein nicht gesetzter Parameter damit der leere Text ist. Im Ein-Zustand des Schalters würde genau dieser Fall nicht mehr zurückfallen, wenn "" dort als echter Wert gilt. Die Vorgabe Aus deckt den Fall weiter ab, aber die Frage, was „wirklich nichts" genau heißt, entscheidet, ob der Schalter für Texte überhaupt brauchbar ist.

Rückfragen

  1. Was ist im Ein-Zustand leer?
    a) Nur null bzw. kein Objekt und ein unverbundener Eingang. "", leere Liste und leerer Struct sind echte Werte. (Das ist deine Formulierung wörtlich genommen.)
    b) Wie a), aber ein leerer Text, eine leere Liste und ein Struct ohne Felder zählen weiter als leer — leer bleibt „nichts da", nur 0 und false werden zu echten Werten. (Damit bliebe der Animations-Fall auch im Ein-Zustand heil.)

  2. Wie heißt der Schalter im Inspector? Vorschlag: Only null counts as empty (Aus = Vorgabe). Alternativ eine Auswahl mit zwei Stufen statt einer Checkbox: Any empty value / Only nothing.

  3. Mehr als zwei Eingänge? a, b, c … wachsen mit, sobald der letzte belegt ist, wie bei Sequence (derivePorts). Dann braucht eine Kette aus drei Rückfällen nur einen Node statt zwei. Soll das mit hinein, oder bleibt es bei zwei Eingängen?

Umfang

  • isEmptyValue in src/core/graph/values.ts bekommt eine Stufe als zweites Argument.
  • FirstNotEmpty bekommt den Parameter und reicht ihn durch.
  • Unit-Fälle in der Katalog-Tabelle für beide Stufen.
  • Wiki Behaviors, Zeile der Node-Liste.
Der Node `First not empty` (#205) bekommt einen Parameter, der festlegt, was als leer gilt. ## Der Schalter (Entscheidung im Chat, 2026-09-22) - **Aus (Vorgabe, wie heute):** Leerwert jeder Art zählt als leer — nichts verbunden bzw. kein Objekt, `0`, `""`, `false`, leere Liste, Struct mit nur leeren Feldern. - **Ein:** Nur „wirklich nichts" zählt als leer. `0`, `false` und ein leerer Text sind dann echte Werte und werden durchgereicht. Die Vorgabe ist Aus, bestehende Graphen verhalten sich also unverändert. ## Warum Bei Zahlen ist „`0` ist leer" irgendwann im Weg: `0` Schaden, `0` Geschwindigkeit oder `false` als Schalter sind echte Werte, die nicht überschrieben werden sollen. ## Befund, der die Entscheidung unten betrifft Der Anlassfall aus dem Chat (Behavior-Parameter `Animation` mit Variable als Rückfall) funktioniert nur, weil eine Animation als Text reist (`kinds.ts`, `travels: 'string'`, `empty: ''`) und ein nicht gesetzter Parameter damit der leere Text ist. **Im Ein-Zustand des Schalters würde genau dieser Fall nicht mehr zurückfallen**, wenn `""` dort als echter Wert gilt. Die Vorgabe Aus deckt den Fall weiter ab, aber die Frage, was „wirklich nichts" genau heißt, entscheidet, ob der Schalter für Texte überhaupt brauchbar ist. ## Rückfragen 1. **Was ist im Ein-Zustand leer?** a) Nur `null` bzw. kein Objekt und ein unverbundener Eingang. `""`, leere Liste und leerer Struct sind echte Werte. (Das ist deine Formulierung wörtlich genommen.) b) Wie a), aber ein leerer Text, eine leere Liste und ein Struct ohne Felder zählen weiter als leer — leer bleibt „nichts da", nur `0` und `false` werden zu echten Werten. (Damit bliebe der Animations-Fall auch im Ein-Zustand heil.) 2. **Wie heißt der Schalter im Inspector?** Vorschlag: `Only null counts as empty` (Aus = Vorgabe). Alternativ eine Auswahl mit zwei Stufen statt einer Checkbox: `Any empty value` / `Only nothing`. 3. **Mehr als zwei Eingänge?** `a`, `b`, `c` … wachsen mit, sobald der letzte belegt ist, wie bei `Sequence` (`derivePorts`). Dann braucht eine Kette aus drei Rückfällen nur einen Node statt zwei. Soll das mit hinein, oder bleibt es bei zwei Eingängen? ## Umfang - `isEmptyValue` in `src/core/graph/values.ts` bekommt eine Stufe als zweites Argument. - `FirstNotEmpty` bekommt den Parameter und reicht ihn durch. - Unit-Fälle in der Katalog-Tabelle für beide Stufen. - Wiki *Behaviors*, Zeile der Node-Liste.
  1. tristate/dropdown (state wie jetzt - wie bisher, state 2 - "b)", state 3 = "a)")
  2. passend zu 1.
  3. meehr eingänge brauchen wir nicht, lassen wir bei den 2 die wir haben
1. tristate/dropdown (state wie jetzt - wie bisher, state 2 - "b)", state 3 = "a)") 2. passend zu 1. 3. meehr eingänge brauchen wir nicht, lassen wir bei den 2 die wir haben
admin added this to the Development project 2026-09-22 20:16:01 +02:00
admin moved this to Next in Development on 2026-09-22 20:16:03 +02:00
Author
Owner

Umgesetzt in 1a3babf, Wiki in a526c0b.

Der Node hat jetzt den Parameter Empty means mit den drei Stufen aus deiner Antwort:

Stufe Was als leer gilt
Any empty value (Vorgabe, wie bisher) nichts da, 0, "", false, leere Liste, Struct mit nur leeren Feldern (also auch Position (0,0))
Nothing there (0 and false count) nichts da, leerer Text, leere Liste, leerer Struct. 0 und false sind echte Werte, Position (0,0) ebenso
Only a missing value nur, wenn gar nichts ankommt. "", leere Liste und leerer Struct sind echte Werte

Entscheidungen:

  • Die Vorgabe ist Any empty value, bestehende Graphen verhalten sich unverändert — auch der Aufbau mit einem nicht gesetzten Behavior-Parameter, der als leerer Text ankommt.
  • Mehr Eingänge (a, b, c …) gibt es wie gewünscht nicht, es bleibt bei zwei.
  • Die Regel steckt in isEmptyValue(value, mode) (src/core/graph/values.ts), der Node reicht die Stufe nur durch. Eine unbekannte Einstellung verhält sich wie die Vorgabe, genau wie bei Compare.
  • Die Node-Beschreibung ist kürzer, weil die alte im Inspector abgeschnitten wurde.

Befund: In der Stufe Nothing there ist ein Struct nur dann leer, wenn seine Felder nach derselben Stufe leer sind — eine Position (0,0) bleibt damit ein echter Wert.

Tests:

./check.sh    → 142 Files, 2113 Tests, CHECK EXIT 0   (vorher 2104)
npm run build → BUILD EXIT 0
  • 9 neue Unit-Fälle in der Katalog-Tabelle: je Stufe die Grenzfälle (0, false, leerer Text, leere Liste, Position (0,0), unverbundenes a) plus „unbekannte Einstellung = Vorgabe“.
  • Zwei Gegenproben greifen: Lässt man Nothing there wie Any wirken, fallen genau die 3 Fälle mit 0/false/Position; nimmt man die Stufe Only a missing value heraus, fallen die 2 Fälle mit leerem Text und leerer Liste. Originale danach zurückgeholt und neu gebaut.
  • Im Browser angesehen: Der Node zeigt „Empty means: Any empty value“, das Dropdown im Inspector listet alle drei Stufen.
  • Kein e2e-Check — einzelne Data-Nodes haben hier keine e2e-Abdeckung, die Check-Summe bleibt bei 1293 (gerechnet).
  • Auf den CI-Lauf zu 1a3babf wurde nicht gewartet.
Umgesetzt in `1a3babf`, Wiki in `a526c0b`. Der Node hat jetzt den Parameter **`Empty means`** mit den drei Stufen aus deiner Antwort: | Stufe | Was als leer gilt | |---|---| | **Any empty value** (Vorgabe, wie bisher) | nichts da, `0`, `""`, `false`, leere Liste, Struct mit nur leeren Feldern (also auch Position (0,0)) | | **Nothing there (0 and false count)** | nichts da, leerer Text, leere Liste, leerer Struct. `0` und `false` sind echte Werte, Position (0,0) ebenso | | **Only a missing value** | nur, wenn gar nichts ankommt. `""`, leere Liste und leerer Struct sind echte Werte | Entscheidungen: - Die Vorgabe ist `Any empty value`, bestehende Graphen verhalten sich unverändert — auch der Aufbau mit einem nicht gesetzten Behavior-Parameter, der als leerer Text ankommt. - Mehr Eingänge (`a`, `b`, `c` …) gibt es wie gewünscht nicht, es bleibt bei zwei. - Die Regel steckt in `isEmptyValue(value, mode)` (`src/core/graph/values.ts`), der Node reicht die Stufe nur durch. Eine unbekannte Einstellung verhält sich wie die Vorgabe, genau wie bei `Compare`. - Die Node-Beschreibung ist kürzer, weil die alte im Inspector abgeschnitten wurde. Befund: In der Stufe `Nothing there` ist ein Struct nur dann leer, wenn seine Felder nach derselben Stufe leer sind — eine Position (0,0) bleibt damit ein echter Wert. Tests: ``` ./check.sh → 142 Files, 2113 Tests, CHECK EXIT 0 (vorher 2104) npm run build → BUILD EXIT 0 ``` - 9 neue Unit-Fälle in der Katalog-Tabelle: je Stufe die Grenzfälle (`0`, `false`, leerer Text, leere Liste, Position (0,0), unverbundenes `a`) plus „unbekannte Einstellung = Vorgabe“. - Zwei Gegenproben greifen: Lässt man `Nothing there` wie `Any` wirken, fallen genau die 3 Fälle mit `0`/`false`/Position; nimmt man die Stufe `Only a missing value` heraus, fallen die 2 Fälle mit leerem Text und leerer Liste. Originale danach zurückgeholt und neu gebaut. - Im Browser angesehen: Der Node zeigt „Empty means: Any empty value“, das Dropdown im Inspector listet alle drei Stufen. - **Kein e2e-Check** — einzelne Data-Nodes haben hier keine e2e-Abdeckung, die Check-Summe bleibt bei 1293 (gerechnet). - Auf den CI-Lauf zu `1a3babf` wurde nicht gewartet.
admin moved this to Done in Development on 2026-09-22 20:35:09 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#206