UNPKG

@bemedev/app-solid

Version:

Middleware between @bemedev/app-ts and solidjs

1 lines 13.7 kB
{"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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"}