{"version":3,"file":"interpreter.cjs","sources":["../src/interpreter.ts"],"sourcesContent":["import {\n  interpret as _interpret,\n  decomposeSV,\n  type AnyMachine,\n  type InterpreterFrom,\n  type InterpreterOptions,\n  type WorkingStatus,\n} from '@bemedev/app-ts';\nimport { DEFAULT_DELIMITER as replacement } from '@bemedev/app-ts/lib/constants/strings.js';\nimport { INIT_EVENT } from '@bemedev/app-ts/lib/events/constants.js';\nimport type {\n  Ru,\n  SoA,\n} from '@bemedev/app-ts/lib/libs/bemedev/globals/types';\nimport type { StateValue } from '@bemedev/app-ts/lib/states/types';\nimport { merge } from '@bemedev/app-ts/lib/utils/merge.js';\nimport { createMemo, createSignal, untrack, type Signal } from 'solid-js';\nimport { defaultSelector } from './default';\nimport { asyncify } from './helpers';\nimport type {\n  AddOptions_F,\n  Options,\n  SendUI_F,\n  State_F,\n  StateSignal,\n} from './interpreter.types';\n\nclass Interpreter<const M extends AnyMachine, S extends Ru>\n  implements Disposable, AsyncDisposable\n{\n  #status: WorkingStatus = 'idle';\n  #machine: M;\n  #service: InterpreterFrom<M>;\n  #mainState: Signal<StateSignal<M, S>>;\n  #options?: Options<M, S>;\n  private interpreterOptions?: InterpreterOptions<M>;\n\n  get #setState() {\n    return this.#mainState[1];\n  }\n  get #state() {\n    return this.#mainState[0];\n  }\n\n  get #canPerform() {\n    return this.#status === 'started' || this.#status === 'working';\n  }\n\n  get __stateSignal() {\n    return undefined as unknown as StateSignal<M, S>;\n  }\n\n  #setUI = () => {\n    this.#setState(state => {\n      const out = {\n        ...this.#initialState,\n        ...state,\n        uiThread: Object.entries({\n          ...this.#options?.uiThread,\n        }).reduce((acc, [key, value]: [string, any]) => {\n          acc[key as keyof S] = value?.[0]();\n          return acc;\n        }, {} as any),\n      };\n\n      return out;\n    });\n  };\n\n  constructor({\n    machine,\n    options: interpreterOptions,\n    uiThread,\n  }: {\n    machine: M;\n    options?: InterpreterOptions<M>;\n    uiThread?: S;\n  }) {\n    this.#machine = machine;\n    this.interpreterOptions = interpreterOptions;\n\n    this.#service = (_interpret as any)(\n      this.#machine,\n      this.interpreterOptions,\n    );\n\n    this.subscribe(next => {\n      this.#setState(prev => merge(prev, next));\n    });\n\n    if (uiThread) {\n      if (!this.#options) this.#options = {} as any;\n      this.#options!.uiThread = Object.entries(uiThread).reduce(\n        (acc, [key, value]) => {\n          acc[key as keyof S] = createSignal(value);\n          return acc;\n        },\n        {} as any,\n      );\n    }\n\n    const _ui = this.#options?.uiThread;\n\n    this.#initialState = {\n      context: this.#service.context,\n      status: 'idle',\n      value: this.#service.initialValue,\n      event: INIT_EVENT,\n      uiThread: _ui\n        ? Object.entries(_ui)\n            .map(\n              ([key, [signal]]: [string, any]) =>\n                [key, signal()] as [keyof S, S[keyof S]],\n            )\n            .reduce((acc, [key, value]) => {\n              acc[key] = value;\n              return acc;\n            }, {} as any)\n        : undefined,\n    } as StateSignal<M, S>;\n\n    this.#mainState = createSignal(this.#initialState);\n    this.#setUI();\n  }\n\n  get start() {\n    this.#status = 'started';\n    return this.#service.start;\n  }\n\n  get pause() {\n    return this.#service.pause;\n  }\n\n  get resume() {\n    return this.#service.resume;\n  }\n\n  stop = () => {\n    this.#status = 'stopped';\n    this.#service.stop();\n    untrack(this.#mainState[0]);\n  };\n\n  get subscribe() {\n    return this.#service.subscribe;\n  }\n\n  readonly #initialState: StateSignal<M, S>;\n\n  get send() {\n    return this.#service.send;\n  }\n\n  sendUI: SendUI_F<S> = event => {\n    if (!this.#canPerform) return;\n    const fn = this.#options?.uiThread?.[event.type]?.[1];\n\n    const out = fn(event.payload as any);\n    this.#setUI();\n\n    return out;\n  };\n\n  state: State_F<StateSignal<M, S>> = (\n    accessor = defaultSelector,\n    equals,\n  ) => {\n    return createMemo(\n      () => {\n        const value = this.#state();\n        return accessor(value);\n      },\n      this.#initialState,\n      { equals },\n    );\n  };\n\n  watcher = <T>(accessor: (state: StateSignal<M, S>) => T) => {\n    return (equals?: false | ((prev: T, next: T) => boolean)) => {\n      return this.state(accessor, equals);\n    };\n  };\n\n  reducer = <T>(accessor: (state: StateSignal<M, S>) => T) => {\n    return <R = T>(\n      _accessor: (state: T) => R = defaultSelector,\n      equals?: false | ((prev: R, next: R) => boolean),\n    ) => {\n      return this.state(state => {\n        const step1 = accessor(state);\n        const step2 = _accessor(step1);\n        return step2;\n      }, equals);\n    };\n  };\n\n  context = this.reducer<M['context']>(state => state.context);\n  value = this.watcher<StateValue>(state => state.value);\n  status = this.watcher<WorkingStatus>(state => state.status);\n  tags = this.watcher<SoA<string>>(state => state.tags ?? []);\n  ui = this.reducer<Partial<S> | undefined>(state => state.uiThread);\n\n  hasTags = (...tags: string[]) => {\n    const currentTags = this.state(({ tags }) => tags)();\n    if (!currentTags) return false;\n    return tags.every(tag => currentTags.includes(tag));\n  };\n\n  /**\n   * @deprecated\n   * Only for testing purposes\n   */\n  get __isUsedUi() {\n    const state = this.#options?.uiThread;\n    return !!state && Object.keys(state).length > 0;\n  }\n\n  dps = this.watcher(({ value }) =>\n    decomposeSV\n      .low(value)\n      .map(entry => entry.replaceAll('.', replacement)),\n  );\n\n  matches = (...values: string[]) => {\n    const dps = this.dps()();\n    return createMemo(() => values.every(value => dps.includes(value)));\n  };\n\n  contains = (...values: string[]) => {\n    const dps = this.dps()();\n    return createMemo(() => values.some(value => dps.includes(value)));\n  };\n\n  addOptions: AddOptions_F<M, S> = option => {\n    this.#options = merge(this.#options, this.#service.addOptions(option));\n    this.#setUI();\n    return this.#options;\n  };\n\n  provideOptions = (\n    option: Parameters<InterpreterFrom<M>['addOptions']>[0],\n  ) => {\n    const instance = new Interpreter<M, S>({\n      machine: this.#machine,\n      options: this.interpreterOptions,\n    });\n    instance.addOptions(option);\n\n    return instance;\n  };\n\n  dispose = () => {\n    this.stop();\n    this.#service.dispose();\n    this.#options = undefined;\n    (this.#mainState as any) = undefined;\n    this.interpreterOptions = undefined;\n  };\n\n  [Symbol.dispose] = this.dispose;\n  [Symbol.asyncDispose] = asyncify(this.dispose);\n}\n\nexport type AnyInterpreter = Record<\n  | '__stateSignal'\n  | 'state'\n  | 'context'\n  | 'ui'\n  | 'value'\n  | 'status'\n  | 'tags'\n  | 'dps',\n  any\n>;\n\nexport type { Interpreter };\n\nexport type InterpreterArgs<M extends AnyMachine, S extends Ru> = {\n  machine: M;\n  uiThread?: S;\n} & (object extends InterpreterOptions<M>\n  ? { options?: InterpreterOptions<M> }\n  : { options: InterpreterOptions<M> });\n\nexport type Interpreter_F = <const M extends AnyMachine, S extends Ru>(\n  args: InterpreterArgs<M, S>,\n) => Interpreter<M, S>;\n\nexport const createInterpreter: Interpreter_F = args => {\n  return new Interpreter(args as any);\n};\n\nexport const interpret = createInterpreter;\n"],"names":["_interpret","merge","createSignal","INIT_EVENT","untrack","defaultSelector","createMemo","decomposeSV","replacement","asyncify"],"mappings":"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"}