| (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 |