{"version":3,"file":"_untracked-chunk.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/core/primitives/signals/src/linked_signal.ts","../../../../../darwin_arm64-fastbuild-ST-fdfa778d11ba/bin/packages/core/primitives/signals/src/untracked.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {COMPUTING, ERRORED, UNSET} from './computed';\nimport {defaultEquals, ValueEqualityFn} from './equality';\nimport {\n  consumerAfterComputation,\n  consumerBeforeComputation,\n  producerAccessed,\n  producerMarkClean,\n  producerUpdateValueVersion,\n  REACTIVE_NODE,\n  ReactiveNode,\n  runPostProducerCreatedFn,\n  setActiveConsumer,\n  SIGNAL,\n} from './graph';\nimport {signalSetFn, signalUpdateFn} from './signal';\n\n// Required as the signals library is in a separate package, so we need to explicitly ensure the\n// global `ngDevMode` type is defined.\ndeclare const ngDevMode: boolean | undefined;\n\nexport type ComputationFn<S, D> = (source: S, previous?: PreviousValue<S, D>) => D;\nexport type PreviousValue<S, D> = {source: S; value: D};\n\nexport interface LinkedSignalNode<S, D> extends ReactiveNode {\n  /**\n   * Value of the source signal that was used to derive the computed value.\n   */\n  sourceValue: S;\n\n  /**\n   * Current state value, or one of the sentinel values (`UNSET`, `COMPUTING`,\n   * `ERROR`).\n   */\n  value: D;\n\n  /**\n   * If `value` is `ERRORED`, the error caught from the last computation attempt which will\n   * be re-thrown.\n   */\n  error: unknown;\n\n  /**\n   * The source function represents reactive dependency based on which the linked state is reset.\n   */\n  source: () => S;\n\n  /**\n   * The computation function which will produce a new value based on the source and, optionally - previous values.\n   */\n  computation: ComputationFn<S, D>;\n\n  equal: ValueEqualityFn<D>;\n}\n\nexport type LinkedSignalGetter<S, D> = (() => D) & {\n  [SIGNAL]: LinkedSignalNode<S, D>;\n};\n\nexport function createLinkedSignal<S, D>(\n  sourceFn: () => S,\n  computationFn: ComputationFn<S, D>,\n  equalityFn?: ValueEqualityFn<D>,\n): LinkedSignalGetter<S, D> {\n  const node: LinkedSignalNode<S, D> = Object.create(LINKED_SIGNAL_NODE);\n\n  node.source = sourceFn;\n  node.computation = computationFn;\n  if (equalityFn != undefined) {\n    node.equal = equalityFn;\n  }\n\n  const linkedSignalGetter = () => {\n    // Check if the value needs updating before returning it.\n    producerUpdateValueVersion(node);\n\n    // Record that someone looked at this signal.\n    producerAccessed(node);\n\n    if (node.value === ERRORED) {\n      throw node.error;\n    }\n\n    return node.value;\n  };\n\n  const getter = linkedSignalGetter as LinkedSignalGetter<S, D>;\n  getter[SIGNAL] = node;\n  if (typeof ngDevMode !== 'undefined' && ngDevMode) {\n    getter.toString = () =>\n      `[LinkedSignal${node.debugName ? ' (' + node.debugName + ')' : ''}: ${String(node.value)}]`;\n  }\n\n  runPostProducerCreatedFn(node);\n\n  return getter;\n}\n\nexport function linkedSignalSetFn<S, D>(node: LinkedSignalNode<S, D>, newValue: D) {\n  producerUpdateValueVersion(node);\n  signalSetFn(node, newValue);\n  producerMarkClean(node);\n}\n\nexport function linkedSignalUpdateFn<S, D>(\n  node: LinkedSignalNode<S, D>,\n  updater: (value: D) => D,\n): void {\n  producerUpdateValueVersion(node);\n  // update() on a linked signal can't work if the current state is ERRORED, as there's no value.\n  if (node.value === ERRORED) {\n    throw node.error;\n  }\n  signalUpdateFn(node, updater);\n  producerMarkClean(node);\n}\n\n// Note: Using an IIFE here to ensure that the spread assignment is not considered\n// a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`.\nexport const LINKED_SIGNAL_NODE: Omit<\n  LinkedSignalNode<unknown, unknown>,\n  'computation' | 'source' | 'sourceValue'\n> = /* @__PURE__ */ (() => {\n  return {\n    ...REACTIVE_NODE,\n    value: UNSET,\n    dirty: true,\n    error: null,\n    equal: defaultEquals,\n    kind: 'linkedSignal',\n\n    producerMustRecompute(node: LinkedSignalNode<unknown, unknown>): boolean {\n      // Force a recomputation if there's no current value, or if the current value is in the\n      // process of being calculated (which should throw an error).\n      return node.value === UNSET || node.value === COMPUTING;\n    },\n\n    producerRecomputeValue(node: LinkedSignalNode<unknown, unknown>): void {\n      if (node.value === COMPUTING) {\n        // Our computation somehow led to a cyclic read of itself.\n        throw new Error(\n          typeof ngDevMode !== 'undefined' && ngDevMode ? 'Detected cycle in computations.' : '',\n        );\n      }\n\n      const oldValue = node.value;\n      node.value = COMPUTING;\n\n      const prevConsumer = consumerBeforeComputation(node);\n      let newValue: unknown;\n      let wasEqual = false;\n      try {\n        const newSourceValue = node.source();\n        const oldValueValid = oldValue !== UNSET && oldValue !== ERRORED;\n        const prev = oldValueValid\n          ? {\n              source: node.sourceValue,\n              value: oldValue,\n            }\n          : undefined;\n        newValue = node.computation(newSourceValue, prev);\n        node.sourceValue = newSourceValue;\n        // We want to mark this node as errored if calling `equal` throws; however, we don't want\n        // to track any reactive reads inside `equal`.\n        setActiveConsumer(null);\n        wasEqual = oldValueValid && newValue !== ERRORED && node.equal(oldValue, newValue);\n      } catch (err) {\n        newValue = ERRORED;\n        node.error = err;\n      } finally {\n        consumerAfterComputation(node, prevConsumer);\n      }\n\n      if (wasEqual) {\n        // No change to `valueVersion` - old and new values are\n        // semantically equivalent.\n        node.value = oldValue;\n        return;\n      }\n\n      node.value = newValue;\n      node.version++;\n    },\n  };\n})();\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {setActiveConsumer} from './graph';\n\n/**\n * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function\n * can, optionally, return a value.\n */\nexport function untracked<T>(nonReactiveReadsFn: () => T): T {\n  const prevConsumer = setActiveConsumer(null);\n  // We are not trying to catch any particular errors here, just making sure that the consumers\n  // stack is restored in case of errors.\n  try {\n    return nonReactiveReadsFn();\n  } finally {\n    setActiveConsumer(prevConsumer);\n  }\n}\n"],"names":["createLinkedSignal","sourceFn","computationFn","equalityFn","node","Object","create","LINKED_SIGNAL_NODE","source","computation","undefined","equal","linkedSignalGetter","producerUpdateValueVersion","producerAccessed","value","ERRORED","error","getter","SIGNAL","ngDevMode","toString","debugName","String","runPostProducerCreatedFn","linkedSignalSetFn","newValue","signalSetFn","producerMarkClean","linkedSignalUpdateFn","updater","signalUpdateFn","REACTIVE_NODE","UNSET","dirty","defaultEquals","kind","producerMustRecompute","COMPUTING","producerRecomputeValue","Error","oldValue","prevConsumer","consumerBeforeComputation","wasEqual","newSourceValue","oldValueValid","prev","sourceValue","setActiveConsumer","err","consumerAfterComputation","version","untracked","nonReactiveReadsFn"],"mappings":"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"}