{"version":3,"file":"Computation.js","sourceRoot":"","sources":["../../../src/execution/incremental/Computation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oCAAmC;AASvD,MAAM,OAAO,WAAW;IAItB,YACE,EAA2B,EAC3B,OAAoD;QAEpD,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,KAAK;QACH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE;oBACR,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;gBACtD,CAAC,EACD,CAAC,MAAe,EAAE,EAAE;oBAClB,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;gBACtD,CAAC,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,OAAO,MAAe,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,MAAM;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,QAAQ,YAAY,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,WAAW;gBACd,OAAO,YAAY,CAAC,KAAK,CAAC;YAC5B,KAAK,UAAU;gBACb,MAAM,YAAY,CAAC,MAAM,CAAC;YAC5B,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,OAAO,YAAY,CAAC,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,MAAgB;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,aAAa,GAAG;gBACnB,MAAM,EAAE,UAAU;gBAClB,MAAM;aACP,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,aAAa,GAAG;gBACnB,MAAM,EAAE,UAAU;gBAClB,MAAM;aACP,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["import { isPromise } from '../../jsutils/isPromise.ts';\nimport type { PromiseOrValue } from '../../jsutils/PromiseOrValue.ts';\n\ntype MaybePromise<T> =\n  | { status: 'fulfilled'; value: T }\n  | { status: 'pending'; promise: Promise<T> }\n  | { status: 'rejected'; reason: unknown };\n\n/** @internal * */\nexport class Computation<T> {\n  private _fn: () => PromiseOrValue<T>;\n  private _onAbort: ((reason?: unknown) => PromiseOrValue<void>) | undefined;\n  private _maybePromise?: MaybePromise<T>;\n  constructor(\n    fn: () => PromiseOrValue<T>,\n    onAbort?: (reason?: unknown) => PromiseOrValue<void>,\n  ) {\n    this._fn = fn;\n    this._onAbort = onAbort;\n  }\n  prime(): MaybePromise<T> {\n    if (this._maybePromise) {\n      return this._maybePromise;\n    }\n    try {\n      const result = this._fn();\n      if (isPromise(result)) {\n        this._maybePromise = { status: 'pending', promise: result };\n        result.then(\n          (value) => {\n            this._maybePromise = { status: 'fulfilled', value };\n          },\n          (reason: unknown) => {\n            this._maybePromise = { status: 'rejected', reason };\n          },\n        );\n      } else {\n        this._maybePromise = { status: 'fulfilled', value: result };\n      }\n    } catch (reason: unknown) {\n      this._maybePromise = { status: 'rejected', reason };\n    }\n    return this._maybePromise;\n  }\n  result(): PromiseOrValue<T> {\n    const maybePromise = this.prime();\n    switch (maybePromise.status) {\n      case 'fulfilled':\n        return maybePromise.value;\n      case 'rejected':\n        throw maybePromise.reason;\n      case 'pending': {\n        return maybePromise.promise;\n      }\n    }\n  }\n  abort(reason?: unknown): PromiseOrValue<void> {\n    const maybePromise = this._maybePromise;\n    if (!maybePromise) {\n      this._maybePromise = {\n        status: 'rejected',\n        reason,\n      };\n      return;\n    }\n    const status = maybePromise.status;\n    if (status === 'pending') {\n      this._maybePromise = {\n        status: 'rejected',\n        reason,\n      };\n      if (this._onAbort) {\n        return this._onAbort(reason);\n      }\n    }\n  }\n}\n"]}