"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); }