queueable
Version:
Convert push-based streams to pull-based async iterables
1 lines • 23.8 kB
Source Map (JSON)
{"version":3,"file":"queueable.modern.mjs","sources":["../src/Deferred.ts","../.yarn/cache/fast-list-npm-1.0.3-73493e1bdd-2bc01386f6.zip/node_modules/fast-list/fast-list.js","../src/Buffer.ts","../src/common.ts","../src/fromDom.ts","../src/fromEmitter.ts","../src/adapters/Multicast.ts","../src/adapters/LastResult.ts","../src/adapters/Channel.ts"],"sourcesContent":["/**\n * Exposes the promise executor callbacks (resolve, reject).\n */\nexport default class Deferred<A> {\n promise: Promise<A>;\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = (value) => {\n resolve(value);\n return this.promise;\n };\n this.reject = (reason) => {\n reject(reason);\n return this.promise;\n };\n });\n }\n}\n\nexport default interface Deferred<A> {\n resolve(value: A | PromiseLike<A>): Promise<A>;\n reject(reason?: string | Error): Promise<A>;\n}\n",";(function() { // closure for web browsers\n\nfunction Item (data, prev, next) {\n this.next = next\n if (next) next.prev = this\n this.prev = prev\n if (prev) prev.next = this\n this.data = data\n}\n\nfunction FastList () {\n if (!(this instanceof FastList)) return new FastList\n this._head = null\n this._tail = null\n this.length = 0\n}\n\nFastList.prototype =\n{ push: function (data) {\n this._tail = new Item(data, this._tail, null)\n if (!this._head) this._head = this._tail\n this.length ++\n }\n\n, pop: function () {\n if (this.length === 0) return undefined\n var t = this._tail\n this._tail = t.prev\n if (t.prev) {\n t.prev = this._tail.next = null\n }\n this.length --\n if (this.length === 1) this._head = this._tail\n else if (this.length === 0) this._head = this._tail = null\n return t.data\n }\n\n, unshift: function (data) {\n this._head = new Item(data, null, this._head)\n if (!this._tail) this._tail = this._head\n this.length ++\n }\n\n, shift: function () {\n if (this.length === 0) return undefined\n var h = this._head\n this._head = h.next\n if (h.next) {\n h.next = this._head.prev = null\n }\n this.length --\n if (this.length === 1) this._tail = this._head\n else if (this.length === 0) this._head = this._tail = null\n return h.data\n }\n\n, item: function (n) {\n if (n < 0) n = this.length + n\n var h = this._head\n while (n-- > 0 && h) h = h.next\n return h ? h.data : undefined\n }\n\n, slice: function (n, m) {\n if (!n) n = 0\n if (!m) m = this.length\n if (m < 0) m = this.length + m\n if (n < 0) n = this.length + n\n\n if (m === n) {\n return []\n }\n\n if (m < n) {\n throw new Error(\"invalid offset: \"+n+\",\"+m+\" (length=\"+this.length+\")\")\n }\n\n var len = m - n\n , ret = new Array(len)\n , i = 0\n , h = this._head\n while (n-- > 0 && h) h = h.next\n while (i < len && h) {\n ret[i++] = h.data\n h = h.next\n }\n return ret\n }\n\n, drop: function () {\n FastList.call(this)\n }\n\n, forEach: function (fn, thisp) {\n var p = this._head\n , i = 0\n , len = this.length\n while (i < len && p) {\n fn.call(thisp || this, p.data, i, this)\n p = p.next\n i ++\n }\n }\n\n, map: function (fn, thisp) {\n var n = new FastList()\n this.forEach(function (v, i, me) {\n n.push(fn.call(thisp || me, v, i, me))\n })\n return n\n }\n\n, filter: function (fn, thisp) {\n var n = new FastList()\n this.forEach(function (v, i, me) {\n if (fn.call(thisp || me, v, i, me)) n.push(v)\n })\n return n\n }\n\n, reduce: function (fn, val, thisp) {\n var i = 0\n , p = this._head\n , len = this.length\n if (!val) {\n i = 1\n val = p && p.data\n p = p && p.next\n }\n while (i < len && p) {\n val = fn.call(thisp || this, val, p.data, this)\n i ++\n p = p.next\n }\n return val\n }\n}\n\nif (\"undefined\" !== typeof(exports)) module.exports = FastList\nelse if (\"function\" === typeof(define) && define.amd) {\n define(\"FastList\", function() { return FastList })\n} else (function () { return this })().FastList = FastList\n\n})()\n","import fastList from 'fast-list';\n\n/**\n * First-in, first-out (FIFO) buffer (queue) with default item values.\n * Optionally circular based on {@link Buffer.limit}.\n * Can be switched to LIFO with {@link Buffer#reverse}.\n */\nexport default class Buffer<A> {\n #list: fastList.List<A>;\n #reversed = false;\n length = 0;\n\n constructor(\n /** The length after which the buffer becomes circular, i.e., discards oldest items. */\n readonly limit = Infinity,\n ) {\n this.#list = new fastList();\n }\n /**\n * Add an item to the end of the buffer.\n */\n enqueue(value: A): void {\n const list = this.#list;\n if (list.length === this.limit) {\n // Discard oldest item\n list.shift();\n } else {\n this.length += 1;\n }\n list.push(value);\n }\n /**\n * Return the oldest item from the buffer.\n */\n dequeue(): A {\n if (this.length === 0) {\n throw Error('Buffer is empty');\n }\n this.length -= 1;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#reversed ? this.#list.pop()! : this.#list.shift()!;\n }\n\n clear(): void {\n this.length = 0;\n this.#list.drop();\n }\n\n forEach(f: (value: A) => void): void {\n this.#list.forEach(f);\n }\n\n reverse() {\n this.#reversed = true;\n return this;\n }\n\n [Symbol.iterator]() {\n return {\n next: () => {\n return this.length > 0\n ? {\n value: this.dequeue(),\n done: false as const,\n }\n : {\n done: true as const,\n value: undefined,\n };\n },\n [Symbol.iterator]() {\n return this;\n },\n };\n }\n\n static from<A>(iterable: Iterable<A>, limit: number) {\n const buffer = new Buffer<A>(limit);\n for (const value of iterable) {\n buffer.enqueue(value);\n }\n return buffer;\n }\n}\n","export interface Returnable<A> extends AsyncIterableIterator<A> {\n return(value?: A): Promise<IteratorResult<A>>;\n}\n\nexport interface PushAdapter<A> extends AsyncIterableIterator<A> {\n push(value: A): Promise<IteratorResult<A>>;\n wrap(onReturn?: () => void): AsyncIterableIterator<A>;\n}\n\n/** The result returned from closed iterators. */\nexport const doneResult = Object.freeze({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n value: undefined!,\n done: true,\n});\n\nexport const donePromise = Promise.resolve(doneResult);\n","import { PushAdapter } from './common';\n\nexport type EventMap = GlobalEventHandlersEventMap;\n\n// TODO add overloads for special event targets (Window, Document)\n/**\n * Convert DOM events to an async iterable iterator.\n */\nconst fromDom =\n <T extends keyof EventMap>(init: () => PushAdapter<EventMap[T]>) =>\n (\n type: T,\n target: Target<T>,\n options?: boolean | AddEventListenerOptions,\n ): AsyncIterableIterator<EventMap[T]> => {\n const adapter = init();\n const listener = (event: EventMap[T]) => void adapter.push(event);\n target.addEventListener(type, listener, options);\n return adapter.wrap(() => target.removeEventListener(type, listener, options));\n };\n\nexport type Listener<T extends keyof EventMap> = (e: EventMap[T]) => void;\n\nexport type Target<\n T extends keyof EventMap,\n L = Listener<T>,\n O = boolean | AddEventListenerOptions,\n> = EventTarget & {\n addEventListener(type: T, listener: L, options?: O): void;\n removeEventListener(type: T, listener: L, options?: O): void;\n};\n\nexport default fromDom;\n","import { PushAdapter } from './common';\n\n// TODO implement strict-event-emitter-types support\n/**\n * Convert node EventEmitter events to an async iterable iterator.\n */\nconst fromEmitter =\n <Event>(init: () => PushAdapter<Event>) =>\n (type: string | symbol, emitter: NodeJS.EventEmitter): AsyncIterableIterator<Event> => {\n const adapter = init();\n const listener = (event: Event) => void adapter.push(event);\n emitter.addListener(type, listener);\n return adapter.wrap(() => void emitter.removeListener(type, listener));\n };\n\nexport default fromEmitter;\n","import Channel from './Channel';\nimport { PushAdapter } from '../common';\n\n/**\n * Multicasts pushed values to a variable number of async iterable iterators\n * as receivers or subscribers.\n *\n * Does not buffer pushed values; if no receivers are registered, pushed\n * values are silently discarded.\n */\nexport default class Multicast<A> implements AsyncIterable<A> {\n onStart?(): void;\n onStop?(): void;\n\n readonly receivers: Set<PushAdapter<A>> = new Set();\n\n constructor(private readonly init: () => PushAdapter<A> = () => new Channel()) {}\n\n /**\n * Pushes a value to all registered receivers.\n */\n push(value: A): this {\n this.receivers.forEach((balancer) => balancer.push(value));\n return this;\n }\n\n /**\n * Creates and registers a receiver.\n */\n [Symbol.asyncIterator](): AsyncIterableIterator<A> {\n const producer = this.init();\n const { receivers } = this;\n receivers.add(producer);\n if (this.onStart && receivers.size === 1) {\n this.onStart();\n }\n return producer.wrap(() => {\n receivers.delete(producer);\n if (this.onStop && receivers.size === 0) {\n this.onStop();\n }\n });\n }\n}\n","import Deferred from '../Deferred';\nimport { PushAdapter, doneResult } from '../common';\nimport fromDom from '../fromDom';\nimport fromEmitter from '../fromEmitter';\n\nexport default class LastResult<A> implements PushAdapter<A> {\n private buffer: Deferred<IteratorResult<A>> = new Deferred();\n private closed = false;\n private resolved = false;\n private requested = false;\n\n static fromDom = fromDom(() => new LastResult());\n static fromEmitter = fromEmitter(() => new LastResult());\n\n push(value: A, done = false): Promise<IteratorResult<A>> {\n if (this.closed) {\n throw Error('Iterator closed');\n }\n const result = {\n value,\n done,\n };\n if (this.resolved === false) {\n this.resolved = true;\n } else {\n this.buffer = new Deferred();\n this.resolved = false;\n }\n this.requested = false;\n this.buffer.resolve(result);\n return this.buffer.promise;\n }\n\n async next(): Promise<IteratorResult<A>> {\n if (this.closed) {\n return doneResult;\n }\n this.requested = true;\n return this.buffer.promise;\n }\n\n async return(value?: A): Promise<IteratorResult<A>> {\n this.closed = true;\n if (!this.resolved && this.requested) {\n this.buffer.resolve(doneResult);\n }\n return Promise.resolve({\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n value: value!,\n done: true,\n });\n }\n\n wrap(onReturn?: () => void) {\n const wrapped = {\n next: () => this.next(),\n [Symbol.asyncIterator]() {\n return this;\n },\n return: (value?: A) => {\n if (onReturn) {\n onReturn();\n }\n return this.return(value);\n },\n };\n return wrapped;\n }\n\n [Symbol.asyncIterator]() {\n return this;\n }\n}\n","import Deferred from '../Deferred';\nimport Buffer from '../Buffer';\nimport { PushAdapter, doneResult } from '../common';\nimport fromDom from '../fromDom';\nimport fromEmitter from '../fromEmitter';\n\n/**\n * Async iterable iterator with a non-optional return method.\n */\nexport interface WrappedBalancer<A> extends AsyncIterableIterator<A> {\n // TODO the result can be undefined as well\n return(value?: A): Promise<IteratorResult<A>>;\n throw?: undefined;\n}\n\nexport interface Unpushed<A> {\n result: IteratorResult<A>;\n defer: Deferred<IteratorResult<A>>;\n}\n/**\n * Balances a push queue with a pull queue, also known as a\n * dropping-buffer channel, since the queues are FIFO and\n * can be set to be bounded, i.e., to drop the oldest enqueued\n * values if the limit is exceeded. The channel is unbounded\n * by default.\n */\nexport default class Channel<A> implements PushAdapter<A> {\n /** Pushed results waiting for pulls to resolve */\n readonly pushBuffer: Buffer<Unpushed<A>>;\n /** Unresolved pulls waiting for results to be pushed */\n readonly pullBuffer: Buffer<Deferred<IteratorResult<A>>>;\n /** Determines whether new values can be pushed or pulled */\n private closed = false;\n\n static fromDom = fromDom(() => new Channel());\n static fromEmitter = fromEmitter(() => new Channel());\n\n constructor(\n /** Limit (bounds) after which the oldest buffered value is dropped. */\n limit = Infinity,\n ) {\n this.pushBuffer = new Buffer(limit);\n this.pullBuffer = new Buffer(limit);\n }\n\n /**\n * Pull a promise of the next result.\n */\n next(): Promise<IteratorResult<A>> {\n if (this.closed) {\n return Promise.resolve(doneResult);\n }\n if (this.pushBuffer.length === 0) {\n const defer = new Deferred<IteratorResult<A>>();\n // Buffer the pull to be resolved later\n this.pullBuffer.enqueue(defer);\n // Return the buffered promise that will be resolved and dequeued when a value is pushed\n return defer.promise;\n }\n const { result, defer } = this.pushBuffer.dequeue();\n defer.resolve(result);\n if (result.done) {\n this.close();\n }\n return defer.promise;\n }\n\n /**\n * Push the next result value.\n *\n * @param value - Result\n * @param done - If true, closes the balancer when this result is resolved\n * @throws Throws if the balancer is already closed\n */\n push(value: A, done = false): Promise<IteratorResult<A>> {\n if (this.closed) {\n return Promise.resolve(doneResult);\n }\n const result = {\n value,\n done,\n };\n if (this.pullBuffer.length > 0) {\n return this.pullBuffer.dequeue().resolve(result);\n }\n const defer = new Deferred<IteratorResult<A>>();\n this.pushBuffer.enqueue({ result, defer });\n return defer.promise;\n }\n\n /**\n * Returns itself, since {@link Channel} already implements the iterator protocol.\n */\n [Symbol.asyncIterator]() {\n return this;\n }\n\n /**\n * Closes the balancer; clears the queues and makes {@link Channel#next} only\n * return `doneResult`.\n *\n * @param value - The result value to be returned\n */\n async return(value?: A): Promise<IteratorResult<A>> {\n this.close();\n return {\n done: true,\n // TODO: fix assertion\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n value: value!, // asserting as non-undefined because the TS lib types are incorrect\n };\n }\n\n close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n // Clear the queues\n this.pushBuffer.forEach(({ defer: { resolve } }) => void resolve(doneResult));\n this.pushBuffer.clear();\n this.pullBuffer.forEach(({ resolve }) => void resolve(doneResult));\n this.pullBuffer.clear();\n }\n\n /**\n * Convert {@link Channel} to a generic async iterable iterator to hide implementation details.\n *\n * @param onReturn - Optional callback for when the iterator is closed with {@link Channel#return}\n * @throws Throws if called when closed\n */\n wrap(onReturn?: () => void): WrappedBalancer<A> {\n if (this.closed) {\n throw Error('Balancer is closed');\n }\n return {\n [Symbol.asyncIterator]() {\n return this;\n },\n next: () => this.next(),\n return: async (value?: A) => {\n if (onReturn) {\n onReturn();\n }\n return this.return(value);\n },\n };\n }\n}\n"],"names":["Deferred","constructor","this","promise","Promise","resolve","reject","value","reason","Item","data","prev","next","FastList","_head","_tail","length","prototype","push","pop","t","undefined","unshift","shift","h","item","n","slice","m","Error","len","ret","Array","i","drop","call","forEach","fn","thisp","p","map","v","me","filter","reduce","val","module","_Symbol$iterator","_list","_classPrivateFieldLooseKey","_reversed","Symbol","iterator","Buffer","limit","Infinity","Object","defineProperty","writable","_classPrivateFieldLooseBase","fastList","enqueue","list","dequeue","clear","f","reverse","done","static","iterable","buffer","doneResult","freeze","fromDom","init","type","target","options","adapter","listener","event","addEventListener","wrap","removeEventListener","fromEmitter","emitter","addListener","removeListener","_Symbol$asyncIterator","asyncIterator","Channel","closed","pushBuffer","pullBuffer","defer","result","close","_Symbol$asyncIterator$2","async","onReturn","_this","return","Multicast","receivers","Set","balancer","_Symbol$asyncIterator$1","producer","add","onStart","size","delete","onStop","LastResult","resolved","requested"],"mappings":"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"}