Merge pull request #193823 from microsoft/joh/aggregate-dinosaur

Joh/aggregate-dinosaur
This commit is contained in:
Johannes Rieken
2023-09-22 19:20:02 +02:00
committed by GitHub
8 changed files with 94 additions and 55 deletions

View File

@@ -22,7 +22,7 @@ import { distinct, equals, firstOrDefault, range } from 'vs/base/common/arrays';
import { Delayer, disposableTimeout, timeout } from 'vs/base/common/async';
import { Codicon } from 'vs/base/common/codicons';
import { ThemeIcon } from 'vs/base/common/themables';
import { SetMap } from 'vs/base/common/collections';
import { SetMap } from 'vs/base/common/map';
import { Emitter, Event, EventBufferer, Relay } from 'vs/base/common/event';
import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters';
import { KeyCode } from 'vs/base/common/keyCodes';

View File

@@ -80,51 +80,3 @@ export function intersection<T>(setA: Set<T>, setB: Iterable<T>): Set<T> {
}
return result;
}
export class SetMap<K, V> {
private map = new Map<K, Set<V>>();
add(key: K, value: V): void {
let values = this.map.get(key);
if (!values) {
values = new Set<V>();
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);
}
get(key: K): ReadonlySet<V> {
const values = this.map.get(key);
if (!values) {
return new Set<V>();
}
return values;
}
}

View File

@@ -4,7 +4,8 @@
*--------------------------------------------------------------------------------------------*/
import { compareBy, numberComparator } from 'vs/base/common/arrays';
import { SetMap, groupBy } from 'vs/base/common/collections';
import { groupBy } from 'vs/base/common/collections';
import { SetMap } from './map';
import { createSingleCallFunction } from 'vs/base/common/functional';
import { Iterable } from 'vs/base/common/iterator';

View File

@@ -742,3 +742,51 @@ export class BidirectionalMap<K, V> {
return this._m1.values();
}
}
export class SetMap<K, V> {
private map = new Map<K, Set<V>>();
add(key: K, value: V): void {
let values = this.map.get(key);
if (!values) {
values = new Set<V>();
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);
}
get(key: K): ReadonlySet<V> {
const values = this.map.get(key);
if (!values) {
return new Set<V>();
}
return values;
}
}

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as assert from 'assert';
import { BidirectionalMap, LinkedMap, LRUCache, ResourceMap, Touch } from 'vs/base/common/map';
import { BidirectionalMap, LinkedMap, LRUCache, ResourceMap, SetMap, Touch } from 'vs/base/common/map';
import { extUriIgnorePathCase } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
@@ -571,3 +571,42 @@ suite('BidirectionalMap', () => {
assert.strictEqual(map.getKey(3), undefined);
});
});
suite('SetMap', () => {
test('add and get', () => {
const setMap = new SetMap<string, number>();
setMap.add('a', 1);
setMap.add('a', 2);
setMap.add('b', 3);
assert.deepStrictEqual([...setMap.get('a')], [1, 2]);
assert.deepStrictEqual([...setMap.get('b')], [3]);
});
test('delete', () => {
const setMap = new SetMap<string, number>();
setMap.add('a', 1);
setMap.add('a', 2);
setMap.add('b', 3);
setMap.delete('a', 1);
assert.deepStrictEqual([...setMap.get('a')], [2]);
setMap.delete('a', 2);
assert.deepStrictEqual([...setMap.get('a')], []);
});
test('forEach', () => {
const setMap = new SetMap<string, number>();
setMap.add('a', 1);
setMap.add('a', 2);
setMap.add('b', 3);
let sum = 0;
setMap.forEach('a', value => sum += value);
assert.strictEqual(sum, 3);
});
test('get empty set', () => {
const setMap = new SetMap<string, number>();
assert.deepStrictEqual([...setMap.get('a')], []);
});
});

View File

@@ -7,7 +7,7 @@ import { ITimeout, SequenceDiff } from 'vs/editor/common/diff/defaultLinesDiffCo
import { DetailedLineRangeMapping, LineRangeMapping } from '../rangeMapping';
import { pushMany, compareBy, numberComparator, reverseOrder } from 'vs/base/common/arrays';
import { MonotonousArray, findLastMonotonous } from 'vs/base/common/arraysFind';
import { SetMap } from 'vs/base/common/collections';
import { SetMap } from 'vs/base/common/map';
import { LineRange, LineRangeSet } from 'vs/editor/common/core/lineRange';
import { OffsetRange } from 'vs/editor/common/core/offsetRange';
import { LinesSliceCharSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence';

View File

@@ -6,7 +6,7 @@
import { assertNever } from 'vs/base/common/assert';
import { DeferredPromise } from 'vs/base/common/async';
import { CancellationToken } from 'vs/base/common/cancellation';
import { SetMap } from 'vs/base/common/collections';
import { SetMap } from 'vs/base/common/map';
import { onUnexpectedExternalError } from 'vs/base/common/errors';
import { IDisposable } from 'vs/base/common/lifecycle';
import { ISingleEditOperation } from 'vs/editor/common/core/editOperation';

View File

@@ -11,13 +11,12 @@ import { localize } from 'vs/nls';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle';
import { ThemeIcon } from 'vs/base/common/themables';
import { getOrSet } from 'vs/base/common/map';
import { getOrSet, SetMap } from 'vs/base/common/map';
import { Registry } from 'vs/platform/registry/common/platform';
import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry';
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
import { flatten } from 'vs/base/common/arrays';
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
import { SetMap } from 'vs/base/common/collections';
import { IProgressIndicator } from 'vs/platform/progress/common/progress';
import Severity from 'vs/base/common/severity';
import { IPaneComposite } from 'vs/workbench/common/panecomposite';