evnty
Version:
0-Deps, simple, fast, for browser and node js reactive anonymous event library
1 lines • 4.47 kB
Source Map (JSON)
{"version":3,"sources":["../src/sequence.ts"],"sourcesContent":["import { Callable } from './callable.js';\nimport { Signal } from './signal.js';\n\n/**\n * Sequence<T> is a callable construct for buffering and emitting multiple values in order.\n * It implements both Promise<T> and AsyncIterable<T>, allowing sequential consumption of values.\n * Values pushed before consumption are queued, and consumers await `next()` or iterate via `for await...of`.\n *\n * @template T - The type of values buffered in the sequence.\n * @param abortSignal - Optional AbortSignal to abort iteration and resolve pending next calls.\n */\nexport class Sequence<T> extends Callable<[T], boolean> implements Promise<T>, AsyncIterable<T> {\n private sequence: T[];\n private nextSignal: Signal<boolean>;\n\n constructor(private readonly abortSignal?: AbortSignal) {\n super((value: T) => {\n if (this.abortSignal?.aborted) {\n this.nextSignal(false);\n return false;\n } else {\n this.sequence.push(value);\n if (this.sequence.length === 1) {\n this.nextSignal(true);\n }\n return true;\n }\n });\n this.sequence = [];\n this.nextSignal = new Signal<boolean>(this.abortSignal);\n this.abortSignal?.addEventListener(\n 'abort',\n () => {\n this.nextSignal(false);\n },\n { once: true },\n );\n }\n\n get [Symbol.toStringTag](): string {\n return `Sequence(${this.abortSignal?.aborted ? 'stopped' : 'active'})`;\n }\n\n get promise(): Promise<T> {\n return this.next();\n }\n\n async next(): Promise<T> {\n if (!this.sequence.length) {\n await this.nextSignal;\n }\n return this.sequence.shift()!;\n }\n\n catch<OK = never>(onrejected?: ((reason: any) => OK | PromiseLike<OK>) | null): Promise<T | OK> {\n return this.promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.promise.finally(onfinally);\n }\n\n then<OK = T, ERR = never>(\n onfulfilled?: ((value: T) => OK | PromiseLike<OK>) | null,\n onrejected?: ((reason: unknown) => ERR | PromiseLike<ERR>) | null,\n ): Promise<OK | ERR> {\n return this.promise.then(onfulfilled, onrejected);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T, void, void> {\n return {\n next: async () => {\n try {\n const value = await this;\n return { value, done: false };\n } catch {\n return { value: undefined, done: true };\n }\n },\n return: () => {\n this.nextSignal(false);\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n}\n"],"names":["Sequence","Callable","sequence","nextSignal","constructor","abortSignal","value","aborted","push","length","Signal","addEventListener","once","Symbol","toStringTag","promise","next","shift","catch","onrejected","finally","onfinally","then","onfulfilled","asyncIterator","done","undefined","return","Promise","resolve"],"mappings":";;;;+BAWaA;;;eAAAA;;;6BAXY;2BACF;AAUhB,MAAMA,iBAAoBC,qBAAQ;;IAC/BC,SAAc;IACdC,WAA4B;IAEpCC,YAAY,AAAiBC,WAAyB,CAAE;QACtD,KAAK,CAAC,CAACC;YACL,IAAI,IAAI,CAACD,WAAW,EAAEE,SAAS;gBAC7B,IAAI,CAACJ,UAAU,CAAC;gBAChB,OAAO;YACT,OAAO;gBACL,IAAI,CAACD,QAAQ,CAACM,IAAI,CAACF;gBACnB,IAAI,IAAI,CAACJ,QAAQ,CAACO,MAAM,KAAK,GAAG;oBAC9B,IAAI,CAACN,UAAU,CAAC;gBAClB;gBACA,OAAO;YACT;QACF,SAZ2BE,cAAAA;QAa3B,IAAI,CAACH,QAAQ,GAAG,EAAE;QAClB,IAAI,CAACC,UAAU,GAAG,IAAIO,iBAAM,CAAU,IAAI,CAACL,WAAW;QACtD,IAAI,CAACA,WAAW,EAAEM,iBAChB,SACA;YACE,IAAI,CAACR,UAAU,CAAC;QAClB,GACA;YAAES,MAAM;QAAK;IAEjB;IAEA,IAAI,CAACC,OAAOC,WAAW,CAAC,GAAW;QACjC,OAAO,CAAC,SAAS,EAAE,IAAI,CAACT,WAAW,EAAEE,UAAU,YAAY,SAAS,CAAC,CAAC;IACxE;IAEA,IAAIQ,UAAsB;QACxB,OAAO,IAAI,CAACC,IAAI;IAClB;IAEA,MAAMA,OAAmB;QACvB,IAAI,CAAC,IAAI,CAACd,QAAQ,CAACO,MAAM,EAAE;YACzB,MAAM,IAAI,CAACN,UAAU;QACvB;QACA,OAAO,IAAI,CAACD,QAAQ,CAACe,KAAK;IAC5B;IAEAC,MAAkBC,UAA2D,EAAmB;QAC9F,OAAO,IAAI,CAACJ,OAAO,CAACG,KAAK,CAACC;IAC5B;IAEAC,QAAQC,SAA+B,EAAc;QACnD,OAAO,IAAI,CAACN,OAAO,CAACK,OAAO,CAACC;IAC9B;IAEAC,KACEC,WAAyD,EACzDJ,UAAiE,EAC9C;QACnB,OAAO,IAAI,CAACJ,OAAO,CAACO,IAAI,CAACC,aAAaJ;IACxC;IAEA,CAACN,OAAOW,aAAa,CAAC,GAAiC;QACrD,OAAO;YACLR,MAAM;gBACJ,IAAI;oBACF,MAAMV,QAAQ,MAAM,IAAI;oBACxB,OAAO;wBAAEA;wBAAOmB,MAAM;oBAAM;gBAC9B,EAAE,OAAM;oBACN,OAAO;wBAAEnB,OAAOoB;wBAAWD,MAAM;oBAAK;gBACxC;YACF;YACAE,QAAQ;gBACN,IAAI,CAACxB,UAAU,CAAC;gBAChB,OAAOyB,QAAQC,OAAO,CAAC;oBAAEvB,OAAOoB;oBAAWD,MAAM;gBAAK;YACxD;QACF;IACF;AACF"}