{"version":3,"file":"vast.cjs","names":["state: {\n    references: unknown[];\n  }","registrations: [\n    unknown,\n    (<S>(currentState: S, prevState: S) => void)?,\n  ][]"],"sources":["../src/vast.ts"],"sourcesContent":["import { CB, DynamicValue, Maybe, isFunction, dynamicValue } from 'vest-utils';\n\n// eslint-disable-next-line max-lines-per-function\nexport function createState(\n  onStateChange?: (...args: unknown[]) => unknown,\n): CreateStateReturn {\n  const state: {\n    references: unknown[];\n  } = {\n    references: [],\n  };\n\n  const registrations: [\n    unknown,\n    (<S>(currentState: S, prevState: S) => void)?,\n  ][] = [];\n\n  return {\n    registerStateKey,\n    reset,\n  };\n\n  /**\n   * Registers a new key in the state, takes the initial value (may be a function that returns the initial value), returns a function.\n   *\n   * @example\n   *\n   * const useColor = state.registerStateKey(\"blue\");\n   *\n   * let [color, setColor] = useColor(); // -> [\"blue\", Function]\n   *\n   * setColor(\"green\");\n   *\n   * useColor()[0]; -> \"green\"\n   */\n  function registerStateKey<S>(\n    initialState?: Maybe<StateInput<S>>,\n    onUpdate?: () => void,\n  ): CB<StateHandlerReturn<S>> {\n    const key = registrations.length;\n    registrations.push([initialState, onUpdate]);\n    return initKey(key, initialState);\n  }\n\n  function reset(): void {\n    const prev = current();\n    state.references = [];\n    registrations.forEach(([initialValue], index) =>\n      initKey(index, initialValue, prev[index]),\n    );\n  }\n\n  function initKey<S>(\n    key: number,\n    initialState?: Maybe<StateInput<S>>,\n    prevState?: Maybe<S>,\n  ) {\n    current().push();\n    set(key, dynamicValue(initialState, prevState));\n\n    return function useStateKey(): StateHandlerReturn<S> {\n      return [\n        current()[key],\n        (nextState: SetStateInput<S>) =>\n          set(key, dynamicValue(nextState, current()[key])),\n      ];\n    };\n  }\n\n  function current(): any[] {\n    return state.references;\n  }\n\n  function set(index: number, value: unknown): void {\n    const prevValue = state.references[index];\n    state.references[index] = value;\n\n    const [, onUpdate] = registrations[index];\n\n    if (isFunction(onUpdate)) {\n      onUpdate(value, prevValue);\n    }\n\n    if (isFunction(onStateChange)) {\n      onStateChange();\n    }\n  }\n}\n\ntype StateInput<S> = DynamicValue<S, [prevState?: S]>;\ntype SetStateInput<S> = DynamicValue<S, [prevState: S]>;\n\nexport type State = CreateStateReturn;\nexport type StateHandlerReturn<S> = [S, (nextState: SetStateInput<S>) => void];\nexport type UseState<S> = CB<StateHandlerReturn<S>>;\n\ntype CreateStateReturn = {\n  reset: () => void;\n  registerStateKey: <S>(\n    initialState?: Maybe<StateInput<S>>,\n    onUpdate?: () => void,\n  ) => CB<StateHandlerReturn<S>>;\n};\n"],"mappings":";;;AAGA,SAAgB,YACd,eACmB;CACnB,MAAMA,QAEF,EACF,YAAY,EAAE,EACf;CAED,MAAMC,gBAGA,EAAE;AAER,QAAO;EACL;EACA;EACD;;;;;;;;;;;;;;CAeD,SAAS,iBACP,cACA,UAC2B;EAC3B,MAAM,MAAM,cAAc;AAC1B,gBAAc,KAAK,CAAC,cAAc,SAAS,CAAC;AAC5C,SAAO,QAAQ,KAAK,aAAa;;CAGnC,SAAS,QAAc;EACrB,MAAM,OAAO,SAAS;AACtB,QAAM,aAAa,EAAE;AACrB,gBAAc,SAAS,CAAC,eAAe,UACrC,QAAQ,OAAO,cAAc,KAAK,OAAO,CAC1C;;CAGH,SAAS,QACP,KACA,cACA,WACA;AACA,WAAS,CAAC,MAAM;AAChB,MAAI,kCAAkB,cAAc,UAAU,CAAC;AAE/C,SAAO,SAAS,cAAqC;AACnD,UAAO,CACL,SAAS,CAAC,OACT,cACC,IAAI,kCAAkB,WAAW,SAAS,CAAC,KAAK,CAAC,CACpD;;;CAIL,SAAS,UAAiB;AACxB,SAAO,MAAM;;CAGf,SAAS,IAAI,OAAe,OAAsB;EAChD,MAAM,YAAY,MAAM,WAAW;AACnC,QAAM,WAAW,SAAS;EAE1B,MAAM,GAAG,YAAY,cAAc;AAEnC,iCAAe,SAAS,CACtB,UAAS,OAAO,UAAU;AAG5B,iCAAe,cAAc,CAC3B,gBAAe"}