{
  "version": 3,
  "sources": ["../../../src/waiting/wait-for-condition.ts"],
  "sourcesContent": ["import type { BindingArrayDependencies, 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 { isBinding } from '../binding-utils/type-utils.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 type { EmptyObject } from '../types/empty';\n\nconst emptyDependencies = Object.freeze({} as EmptyObject);\nconst noOp = () => {};\n\n/** `true` is an alias for `'satisfied'`; `false` is an alias for `'continue'` */\nexport type ConditionCheckResult = 'satisfied' | 'stop' | 'continue' | boolean;\n\nexport type ConditionWaitResult = 'satisfied' | 'stopped' | 'timeout';\n\nexport type ConditionChecker<DependenciesT extends BindingDependencies> = (\n  bindingValues: InferBindingValueTypes<DependenciesT>,\n  bindings: DependenciesT\n) => ConditionCheckResult;\n\n/** Waits for the specified condition to be satisfied (or for the checker to be stopped or to timeout) */\nexport const waitForCondition = <DependenciesT extends BindingDependencies>(\n  bindings: DependenciesT | undefined,\n  {\n    checkCondition,\n    timeoutMSec\n  }: {\n    checkCondition: ConditionChecker<DependenciesT>;\n    timeoutMSec?: number;\n  }\n) => {\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 ?? emptyDependencies);\n\n  // Doesn't need to be stable since always used in a callback ref\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n  const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });\n\n  return new Promise<ConditionWaitResult>((resolve) => {\n    let lastTimeout: ReturnType<typeof setTimeout> | undefined;\n    const removers: Array<() => void> = [];\n    const clearRemoversAndTimeout = () => {\n      for (const remover of removers) {\n        remover();\n      }\n      removers.length = 0;\n\n      if (lastTimeout !== undefined) {\n        clearTimeout(lastTimeout);\n        lastTimeout = undefined;\n      }\n    };\n\n    const onDependenciesChanged = () => {\n      const check = checkCondition(getDependencyValues(), bindings ?? (emptyDependencies as DependenciesT));\n      switch (check) {\n        case 'satisfied':\n        case true:\n          return resolve('satisfied');\n        case 'stop':\n          return resolve('stopped');\n        case 'continue':\n        case false:\n        // Nothing to do here\n      }\n    };\n\n    removers.push(...allBindings.map((binding) => binding?.addChangeListener(onDependenciesChanged) ?? noOp));\n\n    if (timeoutMSec !== undefined) {\n      lastTimeout = setTimeout(() => {\n        clearRemoversAndTimeout();\n        resolve('timeout');\n      }, timeoutMSec);\n    }\n\n    onDependenciesChanged();\n  });\n};\n"],
  "mappings": "AAGA,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,sCAAsC;AAC/C,SAAS,oBAAoB;AAG7B,MAAM,oBAAoB,OAAO,OAAO,CAAC,CAAgB;AACzD,MAAM,OAAO,MAAM;AAAC;AAab,MAAM,mBAAmB,CAC9B,UACA;AAAA,EACE;AAAA,EACA;AACF,MAIG;AACH,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,iBAAiB;AAI9H,QAAM,sBAAsB,MAAM,+BAA8C,EAAE,UAAU,kBAAkB,CAAC;AAE/G,SAAO,IAAI,QAA6B,CAAC,YAAY;AACnD,QAAI;AACJ,UAAM,WAA8B,CAAC;AACrC,UAAM,0BAA0B,MAAM;AACpC,iBAAW,WAAW,UAAU;AAC9B,gBAAQ;AAAA,MACV;AACA,eAAS,SAAS;AAElB,UAAI,gBAAgB,QAAW;AAC7B,qBAAa,WAAW;AACxB,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,wBAAwB,MAAM;AAClC,YAAM,QAAQ,eAAe,oBAAoB,GAAG,YAAa,iBAAmC;AACpG,cAAQ,OAAO;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,QAAQ,WAAW;AAAA,QAC5B,KAAK;AACH,iBAAO,QAAQ,SAAS;AAAA,QAC1B,KAAK;AAAA,QACL,KAAK;AAAA,MAEP;AAAA,IACF;AAEA,aAAS,KAAK,GAAG,YAAY,IAAI,CAAC,YAAY,SAAS,kBAAkB,qBAAqB,KAAK,IAAI,CAAC;AAExG,QAAI,gBAAgB,QAAW;AAC7B,oBAAc,WAAW,MAAM;AAC7B,gCAAwB;AACxB,gBAAQ,SAAS;AAAA,MACnB,GAAG,WAAW;AAAA,IAChB;AAEA,0BAAsB;AAAA,EACxB,CAAC;AACH;",
  "names": []
}
