UNPKG

@naturalcycles/js-lib

Version:

Standard library for universal (browser + Node.js) javascript

109 lines (108 loc) 2.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AsyncIterable2 = void 0; const types_1 = require("../types"); /** * Similar to Iterable2, but for AsyncIterable. * * AsyncIterable2 is a wrapper around AsyncIterable that implements "Iterator Helpers proposal": * https://github.com/tc39/proposal-iterator-helpers * * AsyncIterable2 can be removed after the proposal is widely implemented in Node & browsers. * * @experimental */ class AsyncIterable2 { it; constructor(it) { this.it = it; } static of(it) { return new AsyncIterable2(it); } static ofIterable(it) { return new AsyncIterable2({ async *[Symbol.asyncIterator]() { yield* it; }, }); } static empty() { return new AsyncIterable2({ async *[Symbol.asyncIterator]() { }, }); } [Symbol.asyncIterator]() { return this.it[Symbol.asyncIterator](); } async toArray() { // todo: Array.fromAsync is not yet available, use that when it's ready // return await Array.fromAsync(this.it) const res = []; for await (const item of this.it) { res.push(item); } return res; } async forEach(cb) { let i = 0; for await (const v of this.it) { if ((await cb(v, i++)) === types_1.END) return; } } async some(cb) { return !!(await this.find(cb)); } async every(cb) { let i = 0; for await (const v of this.it) { const r = await cb(v, i++); if (r === types_1.END || !r) return false; } return true; } async find(cb) { let i = 0; for await (const v of this.it) { const r = await cb(v, i++); if (r === types_1.END) return; if (r) return v; } } filter(cb) { const { it } = this; return new AsyncIterable2({ async *[Symbol.asyncIterator]() { let i = 0; for await (const v of it) { const r = await cb(v, i++); if (r === types_1.END) return; if (r) yield v; } }, }); } map(mapper) { const { it } = this; return new AsyncIterable2({ async *[Symbol.asyncIterator]() { let i = 0; for await (const v of it) { const r = await mapper(v, i++); if (r === types_1.END) return; if (r === types_1.SKIP) continue; yield r; } }, }); } } exports.AsyncIterable2 = AsyncIterable2;