{
  "version": 3,
  "sources": ["../../../../src/specialized-bindings/derived-binding/use-derived-binding.ts"],
  "sourcesContent": ["import type { BindingDependencies, NamedBindingDependencies } from '../../binding/types/binding-dependencies';\nimport type { InferBindingValueTypes } from '../../binding/types/infer-binding-value-types';\nimport type { ReadonlyBinding } from '../../binding/types/readonly-binding';\nimport { useBinding } from '../../binding/use-binding.mjs';\nimport { isBinding } from '../../binding-utils/type-utils.mjs';\nimport { getStatsHandler } from '../../config/stats-handler.mjs';\nimport { extractBindingDependencyValues } from '../../internal-utils/extract-binding-dependency-values.mjs';\nimport { getTypedKeys } from '../../internal-utils/get-typed-keys.mjs';\nimport { pickLimiterOptions } from '../../limiter/pick-limiter-options.mjs';\nimport { useBindingEffect } from '../../use-binding-effect/use-binding-effect.mjs';\nimport { useCallbackRef } from '../../utility-hooks/use-callback-ref.mjs';\nimport type { DerivedBindingOptions } from './options';\n\n/**\n * Called to compute the derived value on the initial render and anytime the dependencies change.\n *\n * @param bindingValues - The extracted values of the bindings.\n * @param bindings - The original bindings\n *\n * @returns The derived value\n */\nexport type UseDerivedBindingTransformer<GetT, DependenciesT extends BindingDependencies> = (\n  bindingValues: InferBindingValueTypes<DependenciesT>,\n  bindings: DependenciesT\n) => GetT;\n\n/** A derived binding is a binding derived from zero or more other bindings */\nexport const useDerivedBinding = <GetT, DependenciesT extends BindingDependencies>(\n  bindings: DependenciesT | undefined,\n  transformer: UseDerivedBindingTransformer<GetT, DependenciesT>,\n  options: DerivedBindingOptions<GetT>\n): ReadonlyBinding<GetT> => {\n  const {\n    id,\n    deps,\n    areInputValuesEqual,\n    detectInputChanges = true,\n    makeComparableInputValue,\n    areOutputValuesEqual,\n    detectOutputChanges = true\n  } = options;\n\n  const limiterOptions = pickLimiterOptions(options);\n\n  const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);\n  const namedBindings = isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies);\n  const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;\n\n  // Doesn't need to be stable since Refreshable will always get rendered with the latest anyway\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n  const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });\n\n  const measuredTransformer = useCallbackRef((dependencyValues: InferBindingValueTypes<DependenciesT> = getDependencyValues()) => {\n    const startMSec = performance.now();\n    try {\n      return transformer(dependencyValues, bindings ?? (undefined as any as DependenciesT));\n    } finally {\n      getStatsHandler().trackDerivedBindingTransformerDidRun?.({ id, durationMSec: performance.now() - startMSec });\n    }\n  });\n\n  const internalBinding = useBinding(() => measuredTransformer(), {\n    id,\n    areEqual: areOutputValuesEqual,\n    detectChanges: detectOutputChanges\n  });\n\n  useBindingEffect(bindings, (namedBindingValues) => internalBinding.set(measuredTransformer(namedBindingValues)), {\n    deps,\n    areInputValuesEqual,\n    detectInputChanges,\n    makeComparableInputValue,\n    ...limiterOptions\n  });\n\n  return internalBinding;\n};\n"],
  "mappings": "AAGA,SAAS,kBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,uBAAuB;AAChC,SAAS,sCAAsC;AAC/C,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAiBxB,MAAM,oBAAoB,CAC/B,UACA,aACA,YAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,EACxB,IAAI;AAEJ,QAAM,iBAAiB,mBAAmB,OAAO;AAEjD,QAAM,qBAAqB,MAAM,QAAQ,QAAQ,KAAK,UAAU,QAAQ;AACxE,QAAM,gBAAgB,qBAAqB,SAAa;AACxD,QAAM,oBAAoB,kBAAkB,SAAY,aAAa,aAAa,IAAI;AAItF,QAAM,sBAAsB,MAAM,+BAA8C,EAAE,UAAU,kBAAkB,CAAC;AAE/G,QAAM,sBAAsB,eAAe,CAAC,mBAA0D,oBAAoB,MAAM;AAC9H,UAAM,YAAY,YAAY,IAAI;AAClC,QAAI;AACF,aAAO,YAAY,kBAAkB,YAAa,MAAkC;AAAA,IACtF,UAAE;AACA,sBAAgB,EAAE,uCAAuC,EAAE,IAAI,cAAc,YAAY,IAAI,IAAI,UAAU,CAAC;AAAA,IAC9G;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,WAAW,MAAM,oBAAoB,GAAG;AAAA,IAC9D;AAAA,IACA,UAAU;AAAA,IACV,eAAe;AAAA,EACjB,CAAC;AAED,mBAAiB,UAAU,CAAC,uBAAuB,gBAAgB,IAAI,oBAAoB,kBAAkB,CAAC,GAAG;AAAA,IAC/G;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAED,SAAO;AACT;",
  "names": []
}
