{"version":3,"file":"signal.cjs","names":[],"sources":["../../../src/common/data/signal.ts"],"sourcesContent":["import { arrayRemoveElement } from './array'\n\n// I'm aware of this one, but like mine better ;)\n// https://github.com/proposal-signals/proposal-signals\n\nexport type SignalWatcher<T> = (value: T, oldValue: T) => void\n\nexport type Signal<T> = [\n  () => T,\n  (value: T) => void,\n  (fn: SignalWatcher<T>) => () => void,\n  (fn: SignalWatcher<T>) => void,\n] & {\n  get: () => T\n  set: (value: T) => void\n  on: (fn: SignalWatcher<T>) => () => void\n  off: (fn: SignalWatcher<T>) => void\n}\n\n/** Super simple signal implementation */\nexport function useSignal<T = any>(value: T, onChange?: SignalWatcher<T>): Signal<T> {\n  let signal = structuredClone(value)\n\n  const watchers: SignalWatcher<T>[] = []\n\n  function off(fn: SignalWatcher<T>) {\n    arrayRemoveElement(watchers, fn)\n  }\n\n  function on(fn: SignalWatcher<T>) {\n    watchers.push(fn)\n    return () => off(fn)\n  }\n\n  if (onChange)\n    watchers.push(onChange)\n\n  const get = () => structuredClone(signal)\n\n  const set = (value: T) => {\n    if (value !== signal) {\n      const oldValue = signal\n      signal = value\n      watchers.forEach(fn => fn(value, oldValue))\n    }\n  }\n\n  const obj: any = [get, set, on, off]\n  obj.get = get\n  obj.set = set\n  obj.on = on\n  obj.off = off\n  return obj\n}\n"],"mappings":";;;;;AAoBA,SAAgB,UAAmB,OAAU,UAAwC;CACnF,IAAI,SAAS,gBAAgB,MAAM;CAEnC,MAAM,WAA+B,EAAE;CAEvC,SAAS,IAAI,IAAsB;AACjC,+CAAmB,UAAU,GAAG;;CAGlC,SAAS,GAAG,IAAsB;AAChC,WAAS,KAAK,GAAG;AACjB,eAAa,IAAI,GAAG;;AAGtB,KAAI,SACF,UAAS,KAAK,SAAS;CAEzB,MAAM,YAAY,gBAAgB,OAAO;CAEzC,MAAM,OAAO,UAAa;AACxB,MAAI,UAAU,QAAQ;GACpB,MAAM,WAAW;AACjB,YAAS;AACT,YAAS,SAAQ,OAAM,GAAG,OAAO,SAAS,CAAC;;;CAI/C,MAAM,MAAW;EAAC;EAAK;EAAK;EAAI;EAAI;AACpC,KAAI,MAAM;AACV,KAAI,MAAM;AACV,KAAI,KAAK;AACT,KAAI,MAAM;AACV,QAAO"}