{
  "version": 3,
  "sources": ["../../../src/specialized-bindings/flattened-binding.ts"],
  "sourcesContent": ["import { useEffect, useRef } from 'react';\n\nimport 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 { useIsMountedRef } from '../internal-hooks/use-is-mounted-ref.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 { useStableValue } from '../utility-hooks/use-stable-value.mjs';\nimport type { DerivedBindingOptions } from './derived-binding/options';\n\n/**\n * Called to extract the second-level binding on the initial render and anytime the dependencies change.\n *\n * @param bindingValues - The extracted values of bindings.\n * @param bindings - The original bindings.\n *\n * @returns The second-level binding (i.e. a binding determined dynamically by executing this function)\n */\nexport type UseFlattenedBindingTransformer<GetT, DependenciesT extends BindingDependencies> = (\n  bindingValues: InferBindingValueTypes<DependenciesT>,\n  bindings: DependenciesT\n) => ReadonlyBinding<GetT>;\n\n/** Use when a binding contains another binding, to listen to the second-level binding if either the first or second levels change */\nexport const useFlattenedBinding = <GetT, DependenciesT extends BindingDependencies>(\n  bindings: DependenciesT | undefined,\n  transformer: UseFlattenedBindingTransformer<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 isMounted = useIsMountedRef();\n\n  const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);\n  const namedBindings = useStableValue(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 internalBinding = useBinding(() => transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT)).get(), {\n    id,\n    areEqual: areOutputValuesEqual,\n    detectChanges: detectOutputChanges\n  });\n\n  const secondLevelBindingListenerRemover = useRef<(() => void) | undefined>(undefined);\n\n  useBindingEffect(\n    bindings,\n    (dependencyValues) => {\n      secondLevelBindingListenerRemover.current?.();\n      secondLevelBindingListenerRemover.current = undefined;\n\n      const secondLevelBinding = transformer(dependencyValues, bindings ?? (undefined as any as DependenciesT));\n      internalBinding.set(secondLevelBinding.get());\n\n      if (isMounted.current ?? false) {\n        secondLevelBindingListenerRemover.current = secondLevelBinding.addChangeListener(() => {\n          internalBinding.set(secondLevelBinding.get());\n        });\n      }\n    },\n    {\n      deps,\n      areInputValuesEqual,\n      detectInputChanges,\n      makeComparableInputValue,\n      triggerOnMount: true,\n      ...limiterOptions\n    }\n  );\n\n  useEffect(() => {\n    const secondLevelBinding = transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT));\n\n    secondLevelBindingListenerRemover.current = secondLevelBinding.addChangeListener(() => {\n      internalBinding.set(secondLevelBinding.get());\n    });\n\n    return () => {\n      secondLevelBindingListenerRemover.current?.();\n      secondLevelBindingListenerRemover.current = undefined;\n    };\n  });\n\n  return internalBinding;\n};\n"],
  "mappings": "AAAA,SAAS,WAAW,cAAc;AAKlC,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,sBAAsB,CACjC,UACA,aACA,YAC0B;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA,OAAO,CAAC;AAAA,IACR;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,EACxB,IAAI;AAEJ,QAAM,iBAAiB,mBAAmB,OAAO;AAEjD,QAAM,YAAY,gBAAgB;AAElC,QAAM,qBAAqB,MAAM,QAAQ,QAAQ,KAAK,UAAU,QAAQ;AACxE,QAAM,gBAAgB,eAAe,qBAAqB,SAAa,QAAqC;AAC5G,QAAM,oBAAoB,kBAAkB,SAAY,aAAa,aAAa,IAAI;AAItF,QAAM,sBAAsB,MAAM,+BAA8C,EAAE,UAAU,kBAAkB,CAAC;AAE/G,QAAM,kBAAkB,WAAW,MAAM,YAAY,oBAAoB,GAAG,YAAa,MAAkC,EAAE,IAAI,GAAG;AAAA,IAClI;AAAA,IACA,UAAU;AAAA,IACV,eAAe;AAAA,EACjB,CAAC;AAED,QAAM,oCAAoC,OAAiC,MAAS;AAEpF;AAAA,IACE;AAAA,IACA,CAAC,qBAAqB;AACpB,wCAAkC,UAAU;AAC5C,wCAAkC,UAAU;AAE5C,YAAM,qBAAqB,YAAY,kBAAkB,YAAa,MAAkC;AACxG,sBAAgB,IAAI,mBAAmB,IAAI,CAAC;AAE5C,UAAI,UAAU,WAAW,OAAO;AAC9B,0CAAkC,UAAU,mBAAmB,kBAAkB,MAAM;AACrF,0BAAgB,IAAI,mBAAmB,IAAI,CAAC;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAAA,EACF;AAEA,YAAU,MAAM;AACd,UAAM,qBAAqB,YAAY,oBAAoB,GAAG,YAAa,MAAkC;AAE7G,sCAAkC,UAAU,mBAAmB,kBAAkB,MAAM;AACrF,sBAAgB,IAAI,mBAAmB,IAAI,CAAC;AAAA,IAC9C,CAAC;AAED,WAAO,MAAM;AACX,wCAAkC,UAAU;AAC5C,wCAAkC,UAAU;AAAA,IAC9C;AAAA,EACF,CAAC;AAED,SAAO;AACT;",
  "names": []
}
