function linear_state_machine()

in aws/hhvm1/state-machine/generate.hack [297:344]


function linear_state_machine(
  ?string $failure_state,
  dict<string, State> $states,
): StateMachine {
  $names = Vec\keys($states);
  foreach ($names as $i => $name) {
    $type = $states[$name][F::Type];

    if ($type === T::Task) {
      $states[$name][F::Resource] ??= Config::ARN[$name];
      $states[$name][F::ResultPath] ??= path(P::Results, $name, 'success');
      $states[$name][F::Retry] ??= Config::LAMBDA_RETRY_POLICY;
      if ($failure_state is nonnull) {
        $states[$name][F::Catch] ??= vec[
          dict[
            'ErrorEquals' => vec['States.ALL'],
            'ResultPath' => path(P::Results, $name, 'failure'),
            'Next' => $failure_state,
          ],
        ];
      }
      if (idx($states[$name], F::Catch) === vec[]) {
        unset($states[$name][F::Catch]);
      }
    }

    if ($type === T::Map || $type === T::Parallel) {
      $states[$name][F::ResultPath] ??= path(P::Results, $name);
    }

    if (
      $type !== T::Choice &&
      !C\contains_key($states[$name], F::Next) &&
      !C\contains_key($states[$name], F::End)
    ) {
      $next = $names[$i+1] ?? null;
      if ($next is nonnull) {
        $states[$name][F::Next] = $next;
      } else {
        $states[$name][F::End] = true;
      }
    }
  }
  return shape(
    'StartAt' => C\first_keyx($states),
    'States' => $states,
  );
}