{
  "version": 3,
  "sources": ["../../../../src/use-waitable/internal/update-waitable-bindings-with-default-value-producer.ts"],
  "sourcesContent": ["import isPromise from 'is-promise';\nimport type { Binding } from 'react-bindings';\n\nimport { makeValueThenDo } from '../../internal-utils/make-value-then-do.mjs';\nimport type { TypeOrPromisedType } from '../../resolveable/types';\nimport type { UseWaitableDefaultValueProducer } from '../types/args';\n\n/**\n * Updates the error or value bindings for a waitable given a default value producing function (or undefined).\n *\n * If no default value function is provided, this function:\n *\n * - sets error and value to undefined and stops\n *\n * If a default value function is provided, this function:\n *\n * - set error to undefined\n * - runs the default value producer function\n * - if the waitable hasn't otherwise been updated before the default result was produced, the waitable's value is updated with the result\n *\n * Errors in default value producer functions are ignored.\n */\nexport const updateWaitableBindingsWithDefaultValueProducer = <SuccessT, FailureT>({\n  areValuesEqual,\n  defaultValue,\n  error,\n  value\n}: {\n  areValuesEqual: (a: any, b: any) => boolean;\n  defaultValue: UseWaitableDefaultValueProducer<SuccessT> | undefined;\n  error: Binding<FailureT | undefined>;\n  value: Binding<SuccessT | undefined>;\n}): TypeOrPromisedType<void> => {\n  if (error.get() !== undefined) {\n    error.set(undefined);\n  }\n\n  if (defaultValue === undefined) {\n    if (value.get() !== undefined) {\n      value.set(undefined);\n    }\n\n    return;\n  }\n\n  const valueChangeUid = value.getChangeUid();\n  const errorChangeUid = error.getChangeUid();\n\n  try {\n    let alreadyRanThenPart = false;\n    const possiblePromise = makeValueThenDo(defaultValue, (resolvedDefaultValue) => {\n      alreadyRanThenPart = true;\n\n      // If the waitable was already updated before the default value was generated, throw the default away\n      if (valueChangeUid !== value.getChangeUid() || errorChangeUid !== error.getChangeUid()) {\n        return;\n      }\n\n      if (!areValuesEqual(value.get(), resolvedDefaultValue)) {\n        value.set(resolvedDefaultValue);\n      }\n    });\n\n    if (isPromise(possiblePromise)) {\n      // If defaultValue returns a promise, setting value to undefined until the default value is resolved.  Otherwise, we can avoid the\n      // extra set call for synchronous defaultValue functions.\n      //\n      // If the waitable was already updated before the default value was generated, throw the default away.\n      if (\n        !alreadyRanThenPart &&\n        valueChangeUid === value.getChangeUid() &&\n        errorChangeUid === error.getChangeUid() &&\n        value.get() !== undefined\n      ) {\n        value.set(undefined);\n      }\n\n      // Ignoring errors caused by defaultValue functions -- we want to be able to call defaultValue functions even while locked\n      return possiblePromise.catch(() => {});\n    }\n  } catch (_e) {\n    // Ignoring errors caused by defaultValue functions -- we want to be able to call defaultValue functions even while locked\n  }\n};\n"],
  "mappings": "AAAA,OAAO,eAAe;AAGtB,SAAS,uBAAuB;AAmBzB,MAAM,iDAAiD,CAAqB;AAAA,EACjF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKgC;AAC9B,MAAI,MAAM,IAAI,MAAM,QAAW;AAC7B,UAAM,IAAI,MAAS;AAAA,EACrB;AAEA,MAAI,iBAAiB,QAAW;AAC9B,QAAI,MAAM,IAAI,MAAM,QAAW;AAC7B,YAAM,IAAI,MAAS;AAAA,IACrB;AAEA;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,aAAa;AAC1C,QAAM,iBAAiB,MAAM,aAAa;AAE1C,MAAI;AACF,QAAI,qBAAqB;AACzB,UAAM,kBAAkB,gBAAgB,cAAc,CAAC,yBAAyB;AAC9E,2BAAqB;AAGrB,UAAI,mBAAmB,MAAM,aAAa,KAAK,mBAAmB,MAAM,aAAa,GAAG;AACtF;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,MAAM,IAAI,GAAG,oBAAoB,GAAG;AACtD,cAAM,IAAI,oBAAoB;AAAA,MAChC;AAAA,IACF,CAAC;AAED,QAAI,UAAU,eAAe,GAAG;AAK9B,UACE,CAAC,sBACD,mBAAmB,MAAM,aAAa,KACtC,mBAAmB,MAAM,aAAa,KACtC,MAAM,IAAI,MAAM,QAChB;AACA,cAAM,IAAI,MAAS;AAAA,MACrB;AAGA,aAAO,gBAAgB,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvC;AAAA,EACF,SAAS,IAAI;AAAA,EAEb;AACF;",
  "names": []
}
