123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- 'use strict';
- var dP = require('./_object-dp').f;
- var create = require('./_object-create');
- var redefineAll = require('./_redefine-all');
- var ctx = require('./_ctx');
- var anInstance = require('./_an-instance');
- var forOf = require('./_for-of');
- var $iterDefine = require('./_iter-define');
- var step = require('./_iter-step');
- var setSpecies = require('./_set-species');
- var DESCRIPTORS = require('./_descriptors');
- var fastKey = require('./_meta').fastKey;
- var validate = require('./_validate-collection');
- var SIZE = DESCRIPTORS ? '_s' : 'size';
- var getEntry = function (that, key) {
-
- var index = fastKey(key);
- var entry;
- if (index !== 'F') return that._i[index];
-
- for (entry = that._f; entry; entry = entry.n) {
- if (entry.k == key) return entry;
- }
- };
- module.exports = {
- getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
- var C = wrapper(function (that, iterable) {
- anInstance(that, C, NAME, '_i');
- that._t = NAME;
- that._i = create(null);
- that._f = undefined;
- that._l = undefined;
- that[SIZE] = 0;
- if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
- });
- redefineAll(C.prototype, {
-
-
- clear: function clear() {
- for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
- entry.r = true;
- if (entry.p) entry.p = entry.p.n = undefined;
- delete data[entry.i];
- }
- that._f = that._l = undefined;
- that[SIZE] = 0;
- },
-
-
- 'delete': function (key) {
- var that = validate(this, NAME);
- var entry = getEntry(that, key);
- if (entry) {
- var next = entry.n;
- var prev = entry.p;
- delete that._i[entry.i];
- entry.r = true;
- if (prev) prev.n = next;
- if (next) next.p = prev;
- if (that._f == entry) that._f = next;
- if (that._l == entry) that._l = prev;
- that[SIZE]--;
- } return !!entry;
- },
-
-
- forEach: function forEach(callbackfn /* , that = undefined */) {
- validate(this, NAME);
- var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
- var entry;
- while (entry = entry ? entry.n : this._f) {
- f(entry.v, entry.k, this);
-
- while (entry && entry.r) entry = entry.p;
- }
- },
-
-
- has: function has(key) {
- return !!getEntry(validate(this, NAME), key);
- }
- });
- if (DESCRIPTORS) dP(C.prototype, 'size', {
- get: function () {
- return validate(this, NAME)[SIZE];
- }
- });
- return C;
- },
- def: function (that, key, value) {
- var entry = getEntry(that, key);
- var prev, index;
-
- if (entry) {
- entry.v = value;
-
- } else {
- that._l = entry = {
- i: index = fastKey(key, true),
- k: key,
- v: value,
- p: prev = that._l,
- n: undefined,
- r: false
- };
- if (!that._f) that._f = entry;
- if (prev) prev.n = entry;
- that[SIZE]++;
-
- if (index !== 'F') that._i[index] = entry;
- } return that;
- },
- getEntry: getEntry,
- setStrong: function (C, NAME, IS_MAP) {
-
-
- $iterDefine(C, NAME, function (iterated, kind) {
- this._t = validate(iterated, NAME);
- this._k = kind;
- this._l = undefined;
- }, function () {
- var that = this;
- var kind = that._k;
- var entry = that._l;
-
- while (entry && entry.r) entry = entry.p;
-
- if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
-
- that._t = undefined;
- return step(1);
- }
-
- if (kind == 'keys') return step(0, entry.k);
- if (kind == 'values') return step(0, entry.v);
- return step(0, [entry.k, entry.v]);
- }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
-
- setSpecies(NAME);
- }
- };
|