/**
|
* A collection of shims that provide minimal functionality of the ES6 collections.
|
*
|
* These implementations are not meant to be used outside of the ResizeObserver
|
* modules as they cover only a limited range of use cases.
|
*/
|
/* eslint-disable require-jsdoc, valid-jsdoc */
|
const MapShim = (() => {
|
if (typeof Map !== 'undefined') {
|
return Map;
|
}
|
|
/**
|
* Returns index in provided array that matches the specified key.
|
*
|
* @param {Array<Array>} arr
|
* @param {*} key
|
* @returns {number}
|
*/
|
function getIndex(arr, key) {
|
let result = -1;
|
|
arr.some((entry, index) => {
|
if (entry[0] === key) {
|
result = index;
|
|
return true;
|
}
|
|
return false;
|
});
|
|
return result;
|
}
|
|
return class {
|
constructor() {
|
this.__entries__ = [];
|
}
|
|
/**
|
* @returns {boolean}
|
*/
|
get size() {
|
return this.__entries__.length;
|
}
|
|
/**
|
* @param {*} key
|
* @returns {*}
|
*/
|
get(key) {
|
const index = getIndex(this.__entries__, key);
|
const entry = this.__entries__[index];
|
|
return entry && entry[1];
|
}
|
|
/**
|
* @param {*} key
|
* @param {*} value
|
* @returns {void}
|
*/
|
set(key, value) {
|
const index = getIndex(this.__entries__, key);
|
|
if (~index) {
|
this.__entries__[index][1] = value;
|
} else {
|
this.__entries__.push([key, value]);
|
}
|
}
|
|
/**
|
* @param {*} key
|
* @returns {void}
|
*/
|
delete(key) {
|
const entries = this.__entries__;
|
const index = getIndex(entries, key);
|
|
if (~index) {
|
entries.splice(index, 1);
|
}
|
}
|
|
/**
|
* @param {*} key
|
* @returns {void}
|
*/
|
has(key) {
|
return !!~getIndex(this.__entries__, key);
|
}
|
|
/**
|
* @returns {void}
|
*/
|
clear() {
|
this.__entries__.splice(0);
|
}
|
|
/**
|
* @param {Function} callback
|
* @param {*} [ctx=null]
|
* @returns {void}
|
*/
|
forEach(callback, ctx = null) {
|
for (const entry of this.__entries__) {
|
callback.call(ctx, entry[1], entry[0]);
|
}
|
}
|
};
|
})();
|
|
export {MapShim as Map};
|