1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- (function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.setArray = {}));
- })(this, (function (exports) { 'use strict';
- /**
- * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
- * index of the `key` in the backing array.
- *
- * This is designed to allow synchronizing a second array with the contents of the backing array,
- * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
- * and there are never duplicates.
- */
- class SetArray {
- constructor() {
- this._indexes = { __proto__: null };
- this.array = [];
- }
- }
- /**
- * Typescript doesn't allow friend access to private fields, so this just casts the set into a type
- * with public access modifiers.
- */
- function cast(set) {
- return set;
- }
- /**
- * Gets the index associated with `key` in the backing array, if it is already present.
- */
- function get(setarr, key) {
- return cast(setarr)._indexes[key];
- }
- /**
- * Puts `key` into the backing array, if it is not already present. Returns
- * the index of the `key` in the backing array.
- */
- function put(setarr, key) {
- // The key may or may not be present. If it is present, it's a number.
- const index = get(setarr, key);
- if (index !== undefined)
- return index;
- const { array, _indexes: indexes } = cast(setarr);
- const length = array.push(key);
- return (indexes[key] = length - 1);
- }
- /**
- * Pops the last added item out of the SetArray.
- */
- function pop(setarr) {
- const { array, _indexes: indexes } = cast(setarr);
- if (array.length === 0)
- return;
- const last = array.pop();
- indexes[last] = undefined;
- }
- /**
- * Removes the key, if it exists in the set.
- */
- function remove(setarr, key) {
- const index = get(setarr, key);
- if (index === undefined)
- return;
- const { array, _indexes: indexes } = cast(setarr);
- for (let i = index + 1; i < array.length; i++) {
- const k = array[i];
- array[i - 1] = k;
- indexes[k]--;
- }
- indexes[key] = undefined;
- array.pop();
- }
- exports.SetArray = SetArray;
- exports.get = get;
- exports.pop = pop;
- exports.put = put;
- exports.remove = remove;
- Object.defineProperty(exports, '__esModule', { value: true });
- }));
- //# sourceMappingURL=set-array.umd.js.map
|