/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ /** * An interface for a JavaScript object that * acts a dictionary. The keys are strings. */ export type IStringDictionary = Record; /** * An interface for a JavaScript object that * acts a dictionary. The keys are numbers. */ export type INumberDictionary = Record; const hasOwnProperty = Object.prototype.hasOwnProperty; /** * Iterates over each entry in the provided dictionary. The iterator allows * to remove elements and will stop when the callback returns {{false}}. */ export function forEach( from: IStringDictionary | INumberDictionary, callback: (entry: { key: any; value: T }, remove: () => void) => any ): void { for (let key in from) { if (hasOwnProperty.call(from, key)) { const result = callback( { key: key, value: (from as any)[key] }, function () { delete (from as any)[key]; } ); if (result === false) { return; } } } } export class SetMap { private map = new Map>(); add(key: K, value: V): void { let values = this.map.get(key); if (!values) { values = new Set(); this.map.set(key, values); } values.add(value); } delete(key: K, value: V): void { const values = this.map.get(key); if (!values) { return; } values.delete(value); if (values.size === 0) { this.map.delete(key); } } forEach(key: K, fn: (value: V) => void): void { const values = this.map.get(key); if (!values) { return; } values.forEach(fn); } }