UNPKG

es-map

Version:

An ES-spec-compliant Map shim/polyfill/replacement that works as far down as ES3

74 lines (63 loc) 2.06 kB
'use strict'; var SLOT = require('internal-slot'); var setToStringTag = require('es-set-tostringtag'); var CreateIterResultObject = require('es-abstract/2024/CreateIterResultObject'); var DefineMethodProperty = require('es-abstract/2024/DefineMethodProperty'); var OrdinaryObjectCreate = require('es-abstract/2024/OrdinaryObjectCreate'); var requireMapSlot = require('./validation').requireMapSlot; var addIterator = require('./helpers').addIterator; var MapIterator = function MapIterator(map, kind) { requireMapSlot(map, '[[MapIterator]]'); SLOT.set(this, '[[isMapIterator]]', true); var head = SLOT.get(map, '[[head]]'); SLOT.set(this, '[[i]]', head); SLOT.set(this, '[[head]]', head); SLOT.set(this, '[[kind]]', kind); }; var IteratorPrototype = require('iterator.prototype'); if (IteratorPrototype) { MapIterator.prototype = OrdinaryObjectCreate(IteratorPrototype); } addIterator(MapIterator.prototype); DefineMethodProperty( MapIterator.prototype, 'next', function next() { /* eslint no-invalid-this: 0 */ if (!SLOT.has(this, '[[isMapIterator]]')) { throw new TypeError('Not a MapIterator'); } var i = SLOT.get(this, '[[i]]'); var kind = SLOT.get(this, '[[kind]]'); var head = SLOT.get(this, '[[head]]'); if (typeof i === 'undefined') { return CreateIterResultObject(void undefined, true); } while (i.isRemoved() && i !== head) { // back up off of removed entries i = i.prev; } // advance to next unreturned element. var result; while (i.next !== head) { i = i.next; if (!i.isRemoved()) { if (kind === 'key') { result = i.key; } else if (kind === 'value') { result = i.value; } else { result = [i.key, i.value]; } SLOT.set(this, '[[i]]', i); return CreateIterResultObject(result, false); } } // once the iterator is done, it is done forever. SLOT.set(this, '[[i]]', void undefined); return CreateIterResultObject(void undefined, true); }, false ); setToStringTag(MapIterator.prototype, 'Map Iterator'); module.exports = MapIterator;