{"version":3,"file":"signals.cjs","names":[],"sources":["../../src/core/signals.ts"],"sourcesContent":["import { type Readable, type Signal, signal, untrack, watch } from '@vielzeug/ripple';\n\n// ── syncedSignal ──────────────────────────────────────────────────────────────\n\n/**\n * Creates a local writable `Signal<T>` that stays in sync with an external\n * `Reactive<T>`. When `abortSignal` is provided the watcher subscription\n * is disposed automatically on abort; otherwise the caller is responsible for\n * disposal.\n *\n * Initialised synchronously via `untrack` so the first render never reads a\n * stale value. The optional `transform` coerces each incoming value (e.g.\n * `Boolean`, `String`).\n *\n * @example\n * ```ts\n * const value = syncedSignal(options.value, options.signal, (v) => String(v ?? ''));\n * // Without lifecycle signal (test / non-component context):\n * const value = syncedSignal(source);\n * ```\n */\nexport const syncedSignal = <TIn, TOut = TIn>(\n  source: Readable<TIn>,\n  abortSignal?: AbortSignal,\n  transform: (value: TIn) => TOut = (v) => v as unknown as TOut,\n): Signal<TOut> => {\n  const local = signal<TOut>(untrack(() => transform(source.value)));\n  const sub = watch(source, (v) => {\n    local.value = transform(v);\n  });\n\n  if (abortSignal) {\n    abortSignal.addEventListener('abort', () => sub.dispose(), { once: true });\n  }\n\n  return local;\n};\n"],"mappings":"kCAqBA,IAAa,GACX,EACA,EACA,EAAmC,GAAM,IACxB,CACjB,IAAM,GAAA,EAAQ,EAAA,OAAA,EAAA,EAAa,EAAA,QAAA,KAAc,EAAU,EAAO,KAAK,CAAC,CAAC,EAC3D,GAAA,EAAM,EAAA,MAAA,CAAM,EAAS,GAAM,CAC/B,EAAM,MAAQ,EAAU,CAAC,CAC3B,CAAC,EAMD,OAJI,GACF,EAAY,iBAAiB,YAAe,EAAI,QAAQ,EAAG,CAAE,KAAM,EAAK,CAAC,EAGpE,CACT"}