{
  "version": 3,
  "sources": ["../../../../src/specialized-bindings/transient-derived-binding/make-transient-derived-binding.ts"],
  "sourcesContent": ["import type { DoubleLinkedListNode } from 'doublell';\nimport { DoubleLinkedList } from 'doublell';\n\nimport type { BindingArrayDependencies, BindingDependencies, NamedBindingDependencies } from '../../binding/types/binding-dependencies';\nimport type { ChangeListener } from '../../binding/types/change-listener';\nimport type { ReadonlyBinding } from '../../binding/types/readonly-binding';\nimport { isBinding } from '../../binding-utils/type-utils.mjs';\nimport { getLogger } from '../../config/logging.mjs';\nimport { normalizeAsArray } from '../../internal-utils/array-like.mjs';\nimport { extractBindingDependencyValues } from '../../internal-utils/extract-binding-dependency-values.mjs';\nimport { getTypedKeys } from '../../internal-utils/get-typed-keys.mjs';\nimport { makeUID } from '../../internal-utils/uid.mjs';\nimport type { EmptyObject } from '../../types/empty';\nimport type { UseDerivedBindingTransformer } from '../derived-binding/use-derived-binding';\nimport type { MakeTransientDerivedBindingArgs } from './types/transient-derived-binding-args';\n\nconst emptyNamedBindings = Object.freeze({} as EmptyObject);\n\n/**\n * Similar to `useDerivedBinding` except that this binding doesn't persist any values internally.  The derivative is computed each time the\n * getter is accessed and listeners are immediately triggered any time any of the dependencies change.\n *\n * This is most useful for inline declarations of derivatives that would feel too-heavy to declare elsewhere.\n */\nexport const makeTransientDerivedBinding = <GetT, DependenciesT extends BindingDependencies>(\n  bindings: DependenciesT | undefined,\n  transformer: UseDerivedBindingTransformer<GetT, DependenciesT>,\n  { id }: MakeTransientDerivedBindingArgs = {}\n): ReadonlyBinding<GetT> => {\n  const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);\n  const nonNamedBindings = isNonNamedBindings ? (bindings as ReadonlyBinding | BindingArrayDependencies) : undefined;\n  const namedBindings = isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies);\n  const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;\n  const allBindings = isNonNamedBindings ? normalizeAsArray(nonNamedBindings) : Object.values(namedBindings ?? emptyNamedBindings);\n\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n  const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });\n\n  const uid = makeUID();\n\n  /** Registered change listeners */\n  let onChangeListeners: DoubleLinkedList<ChangeListener> | undefined;\n\n  return {\n    isBinding: true,\n    id: id ?? uid,\n    uid,\n    addChangeListener: (listener) => {\n      if (onChangeListeners === undefined) {\n        onChangeListeners = new DoubleLinkedList<ChangeListener>();\n      }\n      let newNode: DoubleLinkedListNode<ChangeListener> | undefined = onChangeListeners.append(listener);\n\n      const removers = allBindings.map((b) => b?.addChangeListener(listener));\n\n      return () => {\n        if (newNode === undefined) {\n          getLogger().debug?.(`A change listener for binding ${id ?? uid} was removed more than once`);\n          return;\n        }\n\n        for (const remover of removers) {\n          return remover?.();\n        }\n\n        onChangeListeners!.remove(newNode);\n        newNode = undefined;\n      };\n    },\n    get: () => transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT)),\n    getChangeUid: () => allBindings.map((b) => b?.getChangeUid() ?? '').join('+'),\n    isModified: () => false,\n    isLocked: () => true,\n    lock: () => () => {},\n    triggerChangeListeners: () => {\n      if (onChangeListeners === undefined) {\n        return 0;\n      }\n\n      const listeners = onChangeListeners.toArray();\n      for (const listener of listeners) {\n        listener();\n      }\n\n      return listeners?.length;\n    }\n  };\n};\n"],
  "mappings": "AACA,SAAS,wBAAwB;AAKjC,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,sCAAsC;AAC/C,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAKxB,MAAM,qBAAqB,OAAO,OAAO,CAAC,CAAgB;AAQnD,MAAM,8BAA8B,CACzC,UACA,aACA,EAAE,GAAG,IAAqC,CAAC,MACjB;AAC1B,QAAM,qBAAqB,MAAM,QAAQ,QAAQ,KAAK,UAAU,QAAQ;AACxE,QAAM,mBAAmB,qBAAsB,WAA0D;AACzG,QAAM,gBAAgB,qBAAqB,SAAa;AACxD,QAAM,oBAAoB,kBAAkB,SAAY,aAAa,aAAa,IAAI;AACtF,QAAM,cAAc,qBAAqB,iBAAiB,gBAAgB,IAAI,OAAO,OAAO,iBAAiB,kBAAkB;AAG/H,QAAM,sBAAsB,MAAM,+BAA8C,EAAE,UAAU,kBAAkB,CAAC;AAE/G,QAAM,MAAM,QAAQ;AAGpB,MAAI;AAEJ,SAAO;AAAA,IACL,WAAW;AAAA,IACX,IAAI,MAAM;AAAA,IACV;AAAA,IACA,mBAAmB,CAAC,aAAa;AAC/B,UAAI,sBAAsB,QAAW;AACnC,4BAAoB,IAAI,iBAAiC;AAAA,MAC3D;AACA,UAAI,UAA4D,kBAAkB,OAAO,QAAQ;AAEjG,YAAM,WAAW,YAAY,IAAI,CAAC,MAAM,GAAG,kBAAkB,QAAQ,CAAC;AAEtE,aAAO,MAAM;AACX,YAAI,YAAY,QAAW;AACzB,oBAAU,EAAE,QAAQ,iCAAiC,MAAM,GAAG,6BAA6B;AAC3F;AAAA,QACF;AAEA,mBAAW,WAAW,UAAU;AAC9B,iBAAO,UAAU;AAAA,QACnB;AAEA,0BAAmB,OAAO,OAAO;AACjC,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,KAAK,MAAM,YAAY,oBAAoB,GAAG,YAAa,MAAkC;AAAA,IAC7F,cAAc,MAAM,YAAY,IAAI,CAAC,MAAM,GAAG,aAAa,KAAK,EAAE,EAAE,KAAK,GAAG;AAAA,IAC5E,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,IAChB,MAAM,MAAM,MAAM;AAAA,IAAC;AAAA,IACnB,wBAAwB,MAAM;AAC5B,UAAI,sBAAsB,QAAW;AACnC,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,kBAAkB,QAAQ;AAC5C,iBAAW,YAAY,WAAW;AAChC,iBAAS;AAAA,MACX;AAEA,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACF;",
  "names": []
}
