NarraLeaf

フロー

実行の経路制御——分岐、ループ、順序付け、そしてグラフを一時停止させる遅延待機

Flow ノードは実行が次にどこへ向かうかを決めます。他のノードはすべて何かを計算したり変更したりしますが、これらは実行ラインをそこに通すだけです。グラフが問いを立てる必要があるとき、繰り返す必要があるとき、待つ必要があるとき、早期に止まる必要があるとき、手を伸ばすのはこれらのノードです。

規約

  • グラフの種類。 Flow ノードは1つを除いてeventグラフで利用でき、Return Valueを除くすべてがmacroグラフでも利用できます。それらはいずれもfunctionグラフには現れません——そのグラフ種別は純粋で非 latent なノードのみを提供し、Flow ノードはいずれも副作用ありと宣言されているためです。本ページ末尾の Function Entry は両方向で例外であり——functionグラフにのみ存在し、他のどこにも存在しません。
  • ピン名。 inは実行の入口です。nexttruefalsethenelsethen0…、case0…、defaultloopcompletedは実行の出口であり、カード上のそれ以外のピンはすべてデータピンです。
  • カード上のリテラルはピン単位で許可されるのであって、型単位ではありません。 下の表の行がそのピンはリテラルを受け付けると記載している場合に限り、配線せずカードに直接値を入力できます。conditionピンにはそれが一つもありません——IfIf ElseWhileは常に配線されたブール値を求めます。
  • ループは1つのカーソルで進みます。 For LoopFor EachWhileは1回の進入につき1ステップだけ進みます。ループ本体の末尾を同じノードのinピンに配線し直すことで、ノードはloopから次の反復を渡し、最終的にcompletedから抜けます。inに戻らない本体はちょうど1回だけ実行されます。
  • Max iterationsは空欄のとき既定で1000になります。 これはブレーキであって目標値ではありません——上限に達すると、作業が完了したかのようにcompletedから抜けます。無制限のモードは存在しません。
  • Blueprint Valueはタイマー類を除く Flow を受け付けます。 DelaySkip Delayはそこでは除外されます——一時停止するプロバイダーは、担当するプロパティを未解決のまま残してしまうためです。

If

if

If(もし)はブール値で実行を振り分けます。実行のたびに出口はちょうど1つだけ発火します。

ピン方向備考
inin · exec
trueout · exec
falseout · exec
conditionin · databoolean配線が必須。

If Else

blueprint.flow.ifElse

If Else(もし・それ以外なら)は、1枚のカードにまとめられた if / else if / else の連鎖です。条件は順番に評価され、最初に真になったものが採用されます。どれも真でなければelseが発火します。

ピン方向備考
inin · exec
thenout · execconditionが真のときに通ります。
elseout · execどの条件も真でないときに通ります。
conditionin · databoolean配線が必須。

カード上のAdd If conditionは、さらに1つの分岐を追加します——boolean型の入力if_N_conditionと、それに対応する実行出力if_N_thenが、固定のelseの直前に挿入されます。追加された条件はconditionの後、追加した順に評価されます。

Switch String

blueprint.flow.switchString

Switch String(文字列分岐)は1つの文字列を各 Case の値と順に比較し、最初に一致した出口を発火させます。どれとも一致しなければdefaultが発火します。値を一度も設定していない Case は決して一致しません——空のままのカードはワイルドカードではなく、永遠に到達しない分岐です。

ピン方向備考
inin · exec
case0out · exec
case1out · exec
defaultout · execどの Case も一致しないときに通ります。
valuein · datastring照合する文字列。カード上のリテラルを受け付けます。
case0Valuein · datastringcase0の照合値。カード上のリテラルを受け付けます。
case1Valuein · datastringcase1の照合値。カード上のリテラルを受け付けます。

Add Casestring型の入力case_N_valueと、それに対応する実行出力case_N_outputを追加し、固定のdefaultの直前に挿入します。追加された Case はcase0case1の後に照合されます。

Sequence

blueprint.flow.sequence

Sequence(順次実行)は各出力をキューに入れ、順番に実行します——1つの分岐が完了してから次が始まります。未接続の出力はスキップされます。あるひとつの分岐の内部でReturnに到達すると、まだキューに残っている分岐はすべて破棄されます。

ピン方向備考
inin · exec
then0out · execカード上では Then 1 と表示されます。
then1out · execThen 2。
then2out · execThen 3。
then3out · execThen 4。

For Loop

blueprint.flow.forLoop

For Loop(For ループ)はstartからstep刻みでendへ向かって数え、値ごとに1回loopを発火させ、その値をindexとして出力します。方向はstepの符号で決まります——インデックスがendを超えていない間は継続します。

ピン方向備考
inin · exec
loopout · exec1回の反復。本体の末尾をinに配線し直します。
completedout · exec範囲を使い切りました。
startin · dataintegerカード上のリテラルを受け付けます。
endin · dataintegerこの値を含みます。カード上のリテラルを受け付けます。
stepin · datainteger0のステップは1として扱われます。カード上のリテラルを受け付けます。
maxIterationsin · datainteger既定値は1000。カード上のリテラルを受け付けます。
indexout · datainteger現在の値。

For Each

blueprint.flow.forEach

For Each(各要素の走査)は JSON 配列を走査し、要素ごとに1回loopを発火させ、itemindexをあわせて出力します。itemsが配列でない場合は失敗せず、直ちにcompletedから抜けます。

ピン方向備考
inin · exec
loopout · exec1つの要素。本体の末尾をinに配線し直します。
completedout · exec配列を使い切りました。
itemsin · datajson走査する配列。
maxIterationsin · datainteger既定値は1000。カード上のリテラルを受け付けます。
itemout · datajson現在の要素。
indexout · datainteger現在の位置。

While

blueprint.flow.while

While(While ループ)はconditionが成り立っている間、loopを発火し続けます。条件は進入のたびに再評価されるため、ループ本体が実際に変更できるもの——変数や実行時の読み取り——でなければならず、ループの前に一度だけ計算された値であってはなりません。

ピン方向備考
inin · exec
loopout · exec1回の反復。本体の末尾をinに配線し直します。
completedout · exec条件が偽になったか、ブレーキが働きました。
conditionin · databoolean配線が必須。
maxIterationsin · datainteger既定値は1000。カード上のリテラルを受け付けます。

Delay

blueprint.flow.delay · Latent

Delay(遅延)は一定時間待機した後、completedから続行します。これは唯一の latent な Flow ノードです——進入してきた実行チェーンを一時停止させるため、functionグラフに現れることができません。関数は呼び出し元へ同期的に結果を返すものであり、未完了の待機を置いておく場所がないためです。

tokenは待機が始まるに出力されるため、このチェーンが一時停止している間に別のチェーンがそれを読み取り、Skip Delayで待機を早めに切り上げることができます。0以下の時間では一切一時停止しません。待機が保留中にグラフの実行がキャンセルされた場合、その待機はキャンセルとして終わり、completedは発火しません。

ピン方向備考
inin · exec
completedout · exec待機の後、またはスキップされ次第、発火します。
durationin · datafloat単位は秒。0.25は250ミリ秒。カード上のリテラルを受け付けます。
tokenout · dataTimerSkip Delayに渡します。

Timerが識別するのは、そのランタイムスコープ内のDelayノードそのものであり、特定の1回の待機ではありません。同じDelayに2つの実行チェーンが同時に停まっている場合、1回のSkip Delayで両方が解放されます。

Skip Delay

blueprint.flow.skipDelay

Skip Delay(遅延のスキップ)は、保留中のDelayを早期に完了させます。対象は自身のcompletedから抜けます。Skip Delay自身はそれを待たず、そのままnextから続行します。Delayのトークンではないものや、現在待機していないDelayを渡した場合は、黙って no-op になります——実行はそのままnextから続行されます。

ピン方向備考
inin · exec
nextout · execスキップが送信され次第、続行します。
timerin · dataTimer早めに切り上げたいDelayのトークン。

Return

blueprint.flow.return

Return(リターン)は現在の実行チェーンを終了させます。実行出力を持たず、Sequenceにまだキューされている分岐もあわせて破棄します。

ピン方向備考
inin · exec

Return Value

blueprint.data.returnValue

Return Value(値の返却)は値を求めた側へ値を返し、チェーンを終了させます。これは Blueprint Value グラフの終端ノードであり——バインドされたプロパティが取る値を決めるノードです。eventグラフにのみ属し、値を産出するオーナー上にのみ配置できます。それ以外の場所に置くと、グラフのバリデーションがそれを指摘します。値を返すグラフがこのノードに到達せずに終了した場合、以前に解決済みの値がそのまま有効であり続けます。

ピン方向備考
inin · exec
valuein · dataanyプロパティが取る値。

fn から返す場合は代わりにFn Returnを使ってください——Functionsを参照してください。

Noop

blueprint.flow.noop

Noop(何もしない)は何も変更せず、実行をそのまま通します。複数の分岐が1本の続きに合流する合流点として、また配線の途中でプレースホルダーとして使うのに向いています。

ピン方向備考
inin · exec
nextout · exec

Function Entry

blueprint.function.entry · Pure

functionグラフが開始する場所です。このカテゴリの中でfunctionグラフが提供する唯一のノードであり、他のどのグラフ種別も提供しない唯一のノードでもあります。

ピン方向備考
inin · exec
thenout · exec

functionグラフは fn の本体ではありません——それは通常のイベントグラフであり、その先頭はFunctionsにあるFnです。functionは計算された値を支えるグラフ種別であり、純粋で非 latent なノードのみを提供します。

このページの目次