{"version":3,"file":"pledge.cjs","sources":["../pledge.js"],"sourcesContent":["/**\n * @experimental Use of this module is not encouraged!\n * This is just an experiment.\n * @todo remove `c8 ignore` line once this is moved to \"non-experimental\"\n */\n\nimport * as queue from './queue.js'\nimport * as object from './object.js'\n\n/* c8 ignore start */\n\n/**\n * @type {queue.Queue<queue.QueueValue<()=>void>>}\n */\nconst ctxFs = queue.create()\n\n/**\n * @param {() => void} f\n */\nconst runInGlobalContext = f => {\n  const isEmpty = queue.isEmpty(ctxFs)\n  queue.enqueue(ctxFs, new queue.QueueValue(f))\n  if (isEmpty) {\n    while (!queue.isEmpty(ctxFs)) {\n      /** @type {queue.QueueValue<()=>{}>} */ (ctxFs.start).v()\n      queue.dequeue(ctxFs)\n    }\n  }\n}\n\n/**\n * @template V\n * @typedef {V | PledgeInstance<V>} Pledge\n */\n\n/**\n * @template {any} Val\n * @template {any} [CancelReason=Error]\n */\nexport class PledgeInstance {\n  constructor () {\n    /**\n     * @type {Val | CancelReason | null}\n     */\n    this._v = null\n    this.isResolved = false\n    /**\n     * @type {Array<function(Val):void> | null}\n     */\n    this._whenResolved = []\n    /**\n     * @type {Array<function(CancelReason):void> | null}\n     */\n    this._whenCanceled = []\n  }\n\n  get isDone () {\n    return this._whenResolved === null\n  }\n\n  get isCanceled () {\n    return !this.isResolved && this._whenResolved === null\n  }\n\n  /**\n   * @param {Val} v\n   */\n  resolve (v) {\n    const whenResolved = this._whenResolved\n    if (whenResolved === null) return\n    this._v = v\n    this.isResolved = true\n    this._whenResolved = null\n    this._whenCanceled = null\n    for (let i = 0; i < whenResolved.length; i++) {\n      whenResolved[i](v)\n    }\n  }\n\n  /**\n   * @param {CancelReason} reason\n   */\n  cancel (reason) {\n    const whenCanceled = this._whenCanceled\n    if (whenCanceled === null) return\n    this._v = reason\n    this._whenResolved = null\n    this._whenCanceled = null\n    for (let i = 0; i < whenCanceled.length; i++) {\n      whenCanceled[i](reason)\n    }\n  }\n\n  /**\n   * @template R\n   * @param {function(Val):Pledge<R>} f\n   * @return {PledgeInstance<R>}\n   */\n  map (f) {\n    /**\n     * @type {PledgeInstance<R>}\n     */\n    const p = new PledgeInstance()\n    this.whenResolved(v => {\n      const result = f(v)\n      if (result instanceof PledgeInstance) {\n        if (result._whenResolved === null) {\n          result.resolve(/** @type {R} */ (result._v))\n        } else {\n          result._whenResolved.push(p.resolve.bind(p))\n        }\n      } else {\n        p.resolve(result)\n      }\n    })\n    return p\n  }\n\n  /**\n   * @param {function(Val):void} f\n   */\n  whenResolved (f) {\n    if (this.isResolved) {\n      f(/** @type {Val} */ (this._v))\n    } else {\n      this._whenResolved?.push(f)\n    }\n  }\n\n  /**\n   * @param {(reason: CancelReason) => void} f\n   */\n  whenCanceled (f) {\n    if (this.isCanceled) {\n      f(/** @type {CancelReason} */ (this._v))\n    } else {\n      this._whenCanceled?.push(f)\n    }\n  }\n\n  /**\n   * @return {Promise<Val>}\n   */\n  promise () {\n    return new Promise((resolve, reject) => {\n      this.whenResolved(resolve)\n      this.whenCanceled(reject)\n    })\n  }\n}\n\n/**\n * @template T\n * @return {PledgeInstance<T>}\n */\nexport const create = () => new PledgeInstance()\n\n/**\n * @typedef {Array<Pledge<unknown>> | Object<string,Pledge<unknown>>} PledgeMap\n */\n\n/**\n * @template {Pledge<unknown> | PledgeMap} P\n * @typedef {P extends PledgeMap ? { [K in keyof P]: P[K] extends Pledge<infer V> ? V : P[K]} : (P extends Pledge<infer V> ? V : never)} Resolved<P>\n */\n\n/**\n * @todo Create a \"resolveHelper\" that will simplify creating indxeddbv2 functions. Double arguments\n * are not necessary.\n *\n * @template V\n * @template {Array<Pledge<unknown>>} DEPS\n * @param {(p: PledgeInstance<V>, ...deps: Resolved<DEPS>) => void} init\n * @param {DEPS} deps\n * @return {PledgeInstance<V>}\n */\nexport const createWithDependencies = (init, ...deps) => {\n  /**\n   * @type {PledgeInstance<V>}\n   */\n  const p = new PledgeInstance()\n  // @ts-ignore @todo remove this\n  all(deps).whenResolved(ds => init(p, ...ds))\n  return p\n}\n\n/**\n * @template R\n * @param {Pledge<R>} p\n * @param {function(R):void} f\n */\nexport const whenResolved = (p, f) => {\n  if (p instanceof PledgeInstance) {\n    return p.whenResolved(f)\n  }\n  return f(p)\n}\n\n/**\n * @template {Pledge<unknown>} P\n * @param {P} p\n * @param {P extends PledgeInstance<unknown, infer CancelReason> ? function(CancelReason):void : function(any):void} f\n */\nexport const whenCanceled = (p, f) => {\n  if (p instanceof PledgeInstance) {\n    p.whenCanceled(f)\n  }\n}\n\n/**\n * @template P\n * @template Q\n * @param {Pledge<P>} p\n * @param {(r: P) => Q} f\n * @return {Pledge<Q>}\n */\nexport const map = (p, f) => {\n  if (p instanceof PledgeInstance) {\n    return p.map(f)\n  }\n  return f(p)\n}\n\n/**\n * @template {PledgeMap} PS\n * @param {PS} ps\n * @return {PledgeInstance<Resolved<PS>>}\n */\nexport const all = ps => {\n  /**\n   * @type {any}\n   */\n  const pall = create()\n  /**\n   * @type {any}\n   */\n  const result = ps instanceof Array ? new Array(ps.length) : {}\n  let waitingPs = ps instanceof Array ? ps.length : object.size(ps)\n  for (const key in ps) {\n    const p = ps[key]\n    whenResolved(p, r => {\n      result[key] = r\n      if (--waitingPs === 0) {\n        // @ts-ignore\n        pall.resolve(result)\n      }\n    })\n  }\n  return pall\n}\n\n/**\n * @template Result\n * @template {any} YieldResults\n * @param {() => Generator<Pledge<YieldResults> | PledgeInstance<YieldResults,any>, Result, any>} f\n * @return {PledgeInstance<Result>}\n */\nexport const coroutine = f => {\n  const p = create()\n  const gen = f()\n  /**\n   * @param {any} [yv]\n   */\n  const handleGen = (yv) => {\n    const res = gen.next(yv)\n    if (res.done) {\n      p.resolve(res.value)\n      return\n    }\n    // @ts-ignore\n    whenCanceled(res.value, (reason) => {\n      gen.throw(reason)\n    })\n    runInGlobalContext(() =>\n      whenResolved(res.value, handleGen)\n    )\n  }\n  handleGen()\n  return p\n}\n\n/**\n * @param {number} timeout\n * @return {PledgeInstance<undefined>}\n */\nexport const wait = timeout => {\n  const p = create()\n  setTimeout(p.resolve.bind(p), timeout)\n  return p\n}\n\n/* c8 ignore end */\n"],"names":["queue.create","queue.isEmpty","queue.enqueue","queue.QueueValue","queue.dequeue","object.size"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAK,GAAGA,YAAY,GAAE;AAC5B;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,CAAC,IAAI;AAChC,EAAE,MAAM,OAAO,GAAGC,aAAa,CAAC,KAAK,EAAC;AACtC,EAAEC,aAAa,CAAC,KAAK,EAAE,IAAIC,gBAAgB,CAAC,CAAC,CAAC,EAAC;AAC/C,EAAE,IAAI,OAAO,EAAE;AACf,IAAI,OAAO,CAACF,aAAa,CAAC,KAAK,CAAC,EAAE;AAClC,8CAA8C,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAE;AAC/D,MAAMG,aAAa,CAAC,KAAK,EAAC;AAC1B,KAAK;AACL,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,cAAc,CAAC;AAC5B,EAAE,WAAW,CAAC,GAAG;AACjB;AACA;AACA;AACA,IAAI,IAAI,CAAC,EAAE,GAAG,KAAI;AAClB,IAAI,IAAI,CAAC,UAAU,GAAG,MAAK;AAC3B;AACA;AACA;AACA,IAAI,IAAI,CAAC,aAAa,GAAG,GAAE;AAC3B;AACA;AACA;AACA,IAAI,IAAI,CAAC,aAAa,GAAG,GAAE;AAC3B,GAAG;AACH;AACA,EAAE,IAAI,MAAM,CAAC,GAAG;AAChB,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,IAAI;AACtC,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,GAAG;AACpB,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;AAC1D,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE;AACd,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,cAAa;AAC3C,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,MAAM;AACrC,IAAI,IAAI,CAAC,EAAE,GAAG,EAAC;AACf,IAAI,IAAI,CAAC,UAAU,GAAG,KAAI;AAC1B,IAAI,IAAI,CAAC,aAAa,GAAG,KAAI;AAC7B,IAAI,IAAI,CAAC,aAAa,GAAG,KAAI;AAC7B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC;AACxB,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE;AAClB,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,cAAa;AAC3C,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,MAAM;AACrC,IAAI,IAAI,CAAC,EAAE,GAAG,OAAM;AACpB,IAAI,IAAI,CAAC,aAAa,GAAG,KAAI;AAC7B,IAAI,IAAI,CAAC,aAAa,GAAG,KAAI;AAC7B,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClD,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAC;AAC7B,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;AACV;AACA;AACA;AACA,IAAI,MAAM,CAAC,GAAG,IAAI,cAAc,GAAE;AAClC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI;AAC3B,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,EAAC;AACzB,MAAM,IAAI,MAAM,YAAY,cAAc,EAAE;AAC5C,QAAQ,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE;AAC3C,UAAU,MAAM,CAAC,OAAO,mBAAmB,MAAM,CAAC,EAAE,GAAE;AACtD,SAAS,MAAM;AACf,UAAU,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC;AACtD,SAAS;AACT,OAAO,MAAM;AACb,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAC;AACzB,OAAO;AACP,KAAK,EAAC;AACN,IAAI,OAAO,CAAC;AACZ,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;AACnB,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,CAAC,qBAAqB,IAAI,CAAC,EAAE,GAAE;AACrC,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,EAAC;AACjC,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;AACnB,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,CAAC,8BAA8B,IAAI,CAAC,EAAE,GAAE;AAC9C,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,EAAC;AACjC,KAAK;AACL,GAAG;AACH;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,GAAG;AACb,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK;AAC5C,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,EAAC;AAChC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAC;AAC/B,KAAK,CAAC;AACN,GAAG;AACH,CAAC;AACD;AACA;AACA;AACA;AACA;AACY,MAAC,MAAM,GAAG,MAAM,IAAI,cAAc,GAAE;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,sBAAsB,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK;AACzD;AACA;AACA;AACA,EAAE,MAAM,CAAC,GAAG,IAAI,cAAc,GAAE;AAChC;AACA,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAC;AAC9C,EAAE,OAAO,CAAC;AACV,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK;AACtC,EAAE,IAAI,CAAC,YAAY,cAAc,EAAE;AACnC,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5B,GAAG;AACH,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK;AACtC,EAAE,IAAI,CAAC,YAAY,cAAc,EAAE;AACnC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,EAAC;AACrB,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK;AAC7B,EAAE,IAAI,CAAC,YAAY,cAAc,EAAE;AACnC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACnB,GAAG;AACH,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,GAAG,GAAG,EAAE,IAAI;AACzB;AACA;AACA;AACA,EAAE,MAAM,IAAI,GAAG,MAAM,GAAE;AACvB;AACA;AACA;AACA,EAAE,MAAM,MAAM,GAAG,EAAE,YAAY,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,GAAE;AAChE,EAAE,IAAI,SAAS,GAAG,EAAE,YAAY,KAAK,GAAG,EAAE,CAAC,MAAM,GAAGC,WAAW,CAAC,EAAE,EAAC;AACnE,EAAE,KAAK,MAAM,GAAG,IAAI,EAAE,EAAE;AACxB,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAC;AACrB,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI;AACzB,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAC;AACrB,MAAM,IAAI,EAAE,SAAS,KAAK,CAAC,EAAE;AAC7B;AACA,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAC;AAC5B,OAAO;AACP,KAAK,EAAC;AACN,GAAG;AACH,EAAE,OAAO,IAAI;AACb,EAAC;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACY,MAAC,SAAS,GAAG,CAAC,IAAI;AAC9B,EAAE,MAAM,CAAC,GAAG,MAAM,GAAE;AACpB,EAAE,MAAM,GAAG,GAAG,CAAC,GAAE;AACjB;AACA;AACA;AACA,EAAE,MAAM,SAAS,GAAG,CAAC,EAAE,KAAK;AAC5B,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,EAAC;AAC5B,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE;AAClB,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC;AAC1B,MAAM,MAAM;AACZ,KAAK;AACL;AACA,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK;AACxC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,EAAC;AACvB,KAAK,EAAC;AACN,IAAI,kBAAkB,CAAC;AACvB,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;AACxC,MAAK;AACL,IAAG;AACH,EAAE,SAAS,GAAE;AACb,EAAE,OAAO,CAAC;AACV,EAAC;AACD;AACA;AACA;AACA;AACA;AACY,MAAC,IAAI,GAAG,OAAO,IAAI;AAC/B,EAAE,MAAM,CAAC,GAAG,MAAM,GAAE;AACpB,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAC;AACxC,EAAE,OAAO,CAAC;AACV,EAAC;AACD;AACA;;;;;;;;;;;;"}