{"version":3,"file":"interpreter.cjs","sources":["../src/interpreter.ts"],"sourcesContent":["import { Machine, type AnyMachine } from './Machine';\n\nimport type {\n  Config,\n  ConfigTypes,\n  IsAsyncConfig,\n  Param,\n  StateDefinition,\n} from './types';\n\nexport type InterpreterOptions<TC> = {\n  overflow?: number;\n} & (object extends TC ? { context?: TC } : { context: TC });\n\nclass Interpreter<\n  const C extends Config,\n  const T extends ConfigTypes<C> = ConfigTypes<C>,\n> {\n  #events!: T['events'];\n  #initialContext!: T['context'];\n\n  // #region Props\n  #data?: T['data'];\n  protected _context!: T['context'];\n  readonly #overflow: number;\n  protected _currentState!: StateDefinition<\n    T['events'],\n    T['context'],\n    T['data']\n  >;\n  #hasNext = true;\n  readonly #machine: Machine<C, T>;\n  // #endregion\n\n  constructor(\n    machine: Machine<C, T>,\n    options?: InterpreterOptions<T['context']>,\n  ) {\n    this.#machine = machine.safe;\n    this.#overflow = options?.overflow ?? 100;\n    this._initializeStates();\n  }\n\n  get machine() {\n    return this.#machine.clone;\n  }\n\n  protected readonly _initializeStates = () => {\n    Object.freeze(this.#initialContext);\n    this._context = this.#initialContext;\n    const states = this.machine.props._states;\n    const initial = this.machine.props.initial;\n\n    const findInitial = states.find(state => state.value === initial)!;\n    this._currentState = findInitial;\n  };\n\n  protected readonly _setCurrentState = (value: string) => {\n    const out = this.machine.props._states.find(\n      _state => _state.value === value,\n    )!;\n    this._currentState = out;\n  };\n\n  #rinit = (events?: T['events']) => {\n    this.#events = events ?? this.#events;\n    this.#hasNext = true;\n    this._context = structuredClone(this.#initialContext);\n    this._setCurrentState(this.#machine.props.initial);\n    return 0;\n  };\n\n  #next = () => {\n    const { context, hasNext, state, data } = this.#machine.next({\n      context: this._context,\n      events: this.#events,\n      state: this._currentState.value,\n    });\n\n    this._context = context;\n    this.#hasNext = hasNext;\n    this._setCurrentState(state ?? this._currentState.value);\n    this.#data = data;\n  };\n\n  #nextAsync = async () => {\n    const { context, hasNext, state, data } =\n      await this.#machine.nextAsync({\n        context: this._context,\n        events: this.#events,\n        state: this._currentState.value,\n      });\n\n    this._context = context;\n    this.#hasNext = hasNext;\n    this._setCurrentState(state ?? this._currentState.value);\n    this.#data = data;\n  };\n\n  setInitialContext = (context: T['context']) => {\n    this.#initialContext = context;\n    Object.freeze(this.#initialContext);\n  };\n\n  readonly build = (...events: Param<T['events']>) => {\n    let iterator = this.#rinit(events[0]);\n\n    while (this.#hasNext) {\n      this.#next();\n      iterator++;\n      if (iterator >= this.#overflow) {\n        throw new Error('Overflow transitions');\n      }\n    }\n\n    return this.#data!;\n  };\n\n  readonly buildAsync = async (...events: Param<T['events']>) => {\n    let iterator = this.#rinit(events[0]);\n\n    while (this.#hasNext) {\n      await this.#nextAsync();\n      iterator++;\n      if (iterator >= this.#overflow) {\n        throw new Error('Overflow transitions');\n      }\n    }\n\n    return this.#data!;\n  };\n}\n\nexport { type Interpreter };\n\ntype ReturnAsync<Async extends boolean, TA, R> = true extends Async\n  ? (...events: Param<TA>) => Promise<NonNullable<R>>\n  : (...events: Param<TA>) => NonNullable<R>;\n\n// Difficult\nexport function interpret<const M extends AnyMachine>(\n  machine: M,\n  options?: InterpreterOptions<M['__types']['context']>,\n): ReturnAsync<\n  IsAsyncConfig<M['__config']>,\n  M['__types']['events'],\n  M['__types']['data']\n> {\n  const interpreter = new (Interpreter as any)(machine, options);\n\n  interpreter.setInitialContext(options?.context ?? {});\n  return (\n    !machine.async ? interpreter.build : interpreter.buildAsync\n  ) as ReturnAsync<\n    IsAsyncConfig<M['__config']>,\n    M['__types']['events'],\n    M['__types']['data']\n  >;\n}\n"],"names":[],"mappings":";;AAcA,MAAM,WAAW,CAAA;AAIf,IAAA,OAAO;AACP,IAAA,eAAe;;AAGf,IAAA,KAAK;AACK,IAAA,QAAQ;AACT,IAAA,SAAS;AACR,IAAA,aAAa;IAKvB,QAAQ,GAAG,IAAI;AACN,IAAA,QAAQ;;IAGjB,WAAA,CACE,OAAsB,EACtB,OAA0C,EAAA;AAE1C,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI;QAC5B,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,QAAQ,IAAI,GAAG;QACzC,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK;IAC5B;IAEmB,iBAAiB,GAAG,MAAK;AAC1C,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;AAE1C,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAE;AAClE,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW;AAClC,IAAA,CAAC;AAEkB,IAAA,gBAAgB,GAAG,CAAC,KAAa,KAAI;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CACzC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAChC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,GAAG;AAC1B,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,CAAC,MAAoB,KAAI;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,OAAO;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;QACrD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;AAClD,QAAA,OAAO,CAAC;AACV,IAAA,CAAC;IAED,KAAK,GAAG,MAAK;AACX,QAAA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3D,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,OAAO;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;AAChC,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACvB,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACnB,IAAA,CAAC;IAED,UAAU,GAAG,YAAW;AACtB,QAAA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,OAAO;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK;AAChC,SAAA,CAAC;AAEJ,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACvB,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;AACnB,IAAA,CAAC;AAED,IAAA,iBAAiB,GAAG,CAAC,OAAqB,KAAI;AAC5C,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;AACrC,IAAA,CAAC;AAEQ,IAAA,KAAK,GAAG,CAAC,GAAG,MAA0B,KAAI;QACjD,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;YACpB,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,QAAQ,EAAE;AACV,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;QACF;QAEA,OAAO,IAAI,CAAC,KAAM;AACpB,IAAA,CAAC;AAEQ,IAAA,UAAU,GAAG,OAAO,GAAG,MAA0B,KAAI;QAC5D,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAErC,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;AACpB,YAAA,MAAM,IAAI,CAAC,UAAU,EAAE;AACvB,YAAA,QAAQ,EAAE;AACV,YAAA,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;QACF;QAEA,OAAO,IAAI,CAAC,KAAM;AACpB,IAAA,CAAC;AACF;AAQD;AACM,SAAU,SAAS,CACvB,OAAU,EACV,OAAqD,EAAA;IAMrD,MAAM,WAAW,GAAG,IAAK,WAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;IAE9D,WAAW,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;AACrD,IAAA,QACE,CAAC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU;AAM/D;;;;"}