{"version":3,"file":"interpret.cjs","sources":["../src/interpret.ts"],"sourcesContent":["import {\n  interpret as _interpret,\n  getByKey,\n  type AnyMachine,\n  type ContextFrom,\n  type EventsFrom,\n  type InterpretArgs,\n  type InterpreterFrom,\n  type State,\n} from '@bemedev/app-ts';\n\nimport { DEFAULT_DELIMITER as replacement } from '@bemedev/app-ts/lib/constants/index.js';\nimport { INIT_EVENT } from '@bemedev/app-ts/lib/events/index.js';\nimport {\n  decomposeSV,\n  replaceAll,\n} from '@bemedev/app-ts/lib/utils/index.js';\n\nimport type { Decompose } from '@bemedev/decompose';\nimport type { types } from '@bemedev/types';\nimport { createMemo, createRoot, from, type Accessor } from 'solid-js';\nimport { defaultSelector } from './default';\n\nexport const interpret = <const M extends AnyMachine>(\n  ...[machine, config]: InterpretArgs<M>\n) => {\n  const service: InterpreterFrom<M> = (_interpret as any)(machine, config);\n\n  type Tc = ContextFrom<M>;\n  type Ev = EventsFrom<M>;\n\n  type StateM =\n    State<Tc, Ev> extends infer P\n      ? {\n          [Key in keyof P]: P[Key];\n        }\n      : never;\n\n  const initialState: StateM = {\n    context: service.context,\n    status: 'idle',\n    value: service.initialValue,\n    event: INIT_EVENT,\n  };\n\n  const _store = from(service);\n  const store = () => _store() ?? initialState;\n\n  const start = service.start;\n  const stop = service.stop;\n  const pause = service.pause;\n  const resume = service.resume;\n\n  type GetProps<T = any, S = ReturnType<typeof store>> = [\n    accessor?: (state: S) => T,\n    equals?: (prev: T, next: T) => boolean,\n  ];\n\n  const state = <T = StateM>(\n    ...[accessor = defaultSelector, equals]: GetProps<T>\n  ) => {\n    const out = createRoot(() =>\n      createMemo(() => accessor(store()), accessor(initialState), {\n        equals,\n      }),\n    );\n\n    return out;\n  };\n\n  const reducer = <T>(accessor: Required<GetProps<T>>[0]) => {\n    const stateAccessor = accessor;\n\n    const reduceS = <R = T>(\n      ...[_accessor = defaultSelector, equals]: GetProps<R, T>\n    ) =>\n      state(_state => {\n        const step1 = stateAccessor(_state);\n        const step2 = _accessor(step1);\n        return step2;\n      }, equals);\n\n    return reduceS;\n  };\n\n  const context = reducer(state => state.context);\n  const send = service.send;\n  const value = () => state(state => state.value)();\n\n  const mapper = (entry: string) =>\n    replaceAll({ entry, match: '.', replacement });\n\n  const dps = () => decomposeSV(value()).map(mapper);\n  const status = () => state(state => state.status)();\n  const tags = () => state(state => state.tags)();\n\n  type DecomposedContext = Decompose<\n    Required<{ context: Tc }>,\n    { object: 'both'; start: false }\n  >;\n\n  // type __Select = typeof service.select;\n\n  // #region select\n  type _Select = <\n    D = StateM & DecomposedContext,\n    K extends Extract<keyof D, string> = Extract<keyof D, string>,\n    R = D[K],\n  >(\n    selector: K,\n    equals?: (prev: R, next: R) => boolean,\n  ) => Accessor<R>;\n\n  const _select: _Select = (selector, equals) => {\n    const initial = getByKey(initialState, selector);\n    const out = createRoot(() =>\n      createMemo(\n        () => {\n          const _state = store();\n          const _out = getByKey(_state, selector);\n\n          return _out;\n        },\n        initial,\n        {\n          equals,\n        },\n      ),\n    );\n\n    return out;\n  };\n\n  type Select = Tc extends types.Primitive ? undefined : _Select;\n\n  const select: Select = (\n    typeof service.context !== 'object' ? undefined : _select\n  ) as any;\n  // #endregion\n\n  const matches = (...values: string[]) => {\n    return () => {\n      const out = values.every(value => dps().includes(value));\n\n      return out;\n    };\n  };\n\n  const contains = (...values: string[]) => {\n    return () => {\n      const out = values.every(value =>\n        dps().every(dp => dp.includes(value)),\n      );\n\n      return out;\n    };\n  };\n\n  const values = Object.keys(machine.flat);\n  const subscribe = service.subscribe;\n  const dispose = service[Symbol.asyncDispose];\n  const addOptions = service.addOptions;\n\n  return {\n    contains,\n    context,\n    dispose,\n    dps,\n    matches,\n    pause,\n    reducer,\n    resume,\n    select,\n    send,\n    start,\n    state,\n    status,\n    stop,\n    subscribe,\n    tags,\n    value,\n    values,\n    addOptions,\n  } as const;\n};\n"],"names":["_interpret","INIT_EVENT","from","defaultSelector","createRoot","createMemo","replaceAll","replacement","decomposeSV","getByKey"],"mappings":"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"}