lib0
Version:
> Monorepo of isomorphic utility functions
1 lines • 12.1 kB
Source Map (JSON)
{"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":"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"}