@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
109 lines (108 loc) • 2.96 kB
JavaScript
;
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;