57 lines
1.5 KiB
JavaScript
57 lines
1.5 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.IterableAccess = exports.MapAccess = void 0;
|
|
exports.isVisitor = isVisitor;
|
|
const utils_1 = require("../utils");
|
|
class MapAccess {
|
|
nextEntry(kseed, vseed) {
|
|
const key = this.nextKey(kseed);
|
|
if (!key.done) {
|
|
const value = this.nextValue(vseed);
|
|
if (!value.done) {
|
|
return utils_1.IterResult.Next([key.value, value.value]);
|
|
}
|
|
}
|
|
return utils_1.IterResult.Done();
|
|
}
|
|
*generate(next) {
|
|
let item;
|
|
while ((item = next()) && !item.done) {
|
|
yield item.value;
|
|
}
|
|
}
|
|
keys(seed) {
|
|
return this.generate(this.nextKey.bind(this, seed));
|
|
}
|
|
values(seed) {
|
|
return this.generate(this.nextValue.bind(this, seed));
|
|
}
|
|
entries(kseed, vseed) {
|
|
return this.generate(this.nextEntry.bind(this, kseed, vseed));
|
|
}
|
|
[Symbol.iterator]() {
|
|
return this.entries();
|
|
}
|
|
}
|
|
exports.MapAccess = MapAccess;
|
|
class IterableAccess {
|
|
[Symbol.iterator]() {
|
|
return {
|
|
next: this.nextElement.bind(this)
|
|
};
|
|
}
|
|
}
|
|
exports.IterableAccess = IterableAccess;
|
|
const VisitorMethods = Object.freeze([
|
|
'visitBoolean',
|
|
'visitNumber',
|
|
'visitBigInt',
|
|
'visitString',
|
|
'visitSymbol',
|
|
'visitNull',
|
|
'visitObject',
|
|
'visitIterable'
|
|
]);
|
|
function isVisitor(visitor) {
|
|
return VisitorMethods.every(method => method in visitor);
|
|
}
|