effex-monorepo
    Preparing search index...

    Variable Transition

    Transition: {
        InvalidTransition: typeof InvalidTransition;
        make: <
            const C extends
                Record<string, readonly TransitionTarget<string & keyof C>[]>,
        >(
            config: C,
            initial: string & keyof C,
        ) => Effect<Transition<string & keyof C>, never, Scope>;
    }

    Type Declaration

    • InvalidTransition: typeof InvalidTransition
    • make: <const C extends Record<string, readonly TransitionTarget<string & keyof C>[]>>(
          config: C,
          initial: string & keyof C,
      ) => Effect<Transition<string & keyof C>, never, Scope>

      Create a state machine with declarative transitions.

      const status = yield* Transition.make(
      {
      idle: ["loading"],
      loading: ["success", "error"],
      success: ["idle"],
      error: ["idle", "loading"],
      },
      "idle"
      );

      yield* status.to("loading"); // works
      yield* status.to("success"); // fails - not allowed from idle

      // Reactive checks
      status.is("idle"); // Readable<boolean>
      status.canTransitionTo("error"); // Readable<boolean>
      const isOnline = yield* Signal.make(true);

      const status = yield* Transition.make(
      {
      idle: [{ to: "loading", when: isOnline }, "error"],
      loading: ["success", "error"],
      success: ["idle"],
      error: ["idle"],
      },
      "idle"
      );

      // canTransitionTo respects guards
      status.canTransitionTo("loading"); // true only when isOnline is true
      const submit = status.guard(
      ["idle"],
      (data: FormData) => submitForm(data),
      { onBlocked: "ignore" }
      );

      yield* submit(formData); // runs only if in "idle" state