mirror of
https://github.com/microsoft/vscode.git
synced 2025-12-20 02:08:47 +00:00
Merge pull request #193823 from microsoft/joh/aggregate-dinosaur
Joh/aggregate-dinosaur
This commit is contained in:
@@ -22,7 +22,7 @@ import { distinct, equals, firstOrDefault, range } from 'vs/base/common/arrays';
|
|||||||
import { Delayer, disposableTimeout, timeout } from 'vs/base/common/async';
|
import { Delayer, disposableTimeout, timeout } from 'vs/base/common/async';
|
||||||
import { Codicon } from 'vs/base/common/codicons';
|
import { Codicon } from 'vs/base/common/codicons';
|
||||||
import { ThemeIcon } from 'vs/base/common/themables';
|
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 { Emitter, Event, EventBufferer, Relay } from 'vs/base/common/event';
|
||||||
import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters';
|
import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters';
|
||||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||||
|
|||||||
@@ -80,51 +80,3 @@ export function intersection<T>(setA: Set<T>, setB: Iterable<T>): Set<T> {
|
|||||||
}
|
}
|
||||||
return result;
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import { compareBy, numberComparator } from 'vs/base/common/arrays';
|
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 { createSingleCallFunction } from 'vs/base/common/functional';
|
||||||
import { Iterable } from 'vs/base/common/iterator';
|
import { Iterable } from 'vs/base/common/iterator';
|
||||||
|
|
||||||
|
|||||||
@@ -742,3 +742,51 @@ export class BidirectionalMap<K, V> {
|
|||||||
return this._m1.values();
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import * as assert from 'assert';
|
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 { extUriIgnorePathCase } from 'vs/base/common/resources';
|
||||||
import { URI } from 'vs/base/common/uri';
|
import { URI } from 'vs/base/common/uri';
|
||||||
|
|
||||||
@@ -571,3 +571,42 @@ suite('BidirectionalMap', () => {
|
|||||||
assert.strictEqual(map.getKey(3), undefined);
|
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')], []);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { ITimeout, SequenceDiff } from 'vs/editor/common/diff/defaultLinesDiffCo
|
|||||||
import { DetailedLineRangeMapping, LineRangeMapping } from '../rangeMapping';
|
import { DetailedLineRangeMapping, LineRangeMapping } from '../rangeMapping';
|
||||||
import { pushMany, compareBy, numberComparator, reverseOrder } from 'vs/base/common/arrays';
|
import { pushMany, compareBy, numberComparator, reverseOrder } from 'vs/base/common/arrays';
|
||||||
import { MonotonousArray, findLastMonotonous } from 'vs/base/common/arraysFind';
|
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 { LineRange, LineRangeSet } from 'vs/editor/common/core/lineRange';
|
||||||
import { OffsetRange } from 'vs/editor/common/core/offsetRange';
|
import { OffsetRange } from 'vs/editor/common/core/offsetRange';
|
||||||
import { LinesSliceCharSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence';
|
import { LinesSliceCharSequence } from 'vs/editor/common/diff/defaultLinesDiffComputer/linesSliceCharSequence';
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
import { assertNever } from 'vs/base/common/assert';
|
import { assertNever } from 'vs/base/common/assert';
|
||||||
import { DeferredPromise } from 'vs/base/common/async';
|
import { DeferredPromise } from 'vs/base/common/async';
|
||||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
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 { onUnexpectedExternalError } from 'vs/base/common/errors';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { ISingleEditOperation } from 'vs/editor/common/core/editOperation';
|
import { ISingleEditOperation } from 'vs/editor/common/core/editOperation';
|
||||||
|
|||||||
@@ -11,13 +11,12 @@ import { localize } from 'vs/nls';
|
|||||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable, Disposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { ThemeIcon } from 'vs/base/common/themables';
|
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 { Registry } from 'vs/platform/registry/common/platform';
|
||||||
import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||||
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
|
||||||
import { flatten } from 'vs/base/common/arrays';
|
import { flatten } from 'vs/base/common/arrays';
|
||||||
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
|
||||||
import { SetMap } from 'vs/base/common/collections';
|
|
||||||
import { IProgressIndicator } from 'vs/platform/progress/common/progress';
|
import { IProgressIndicator } from 'vs/platform/progress/common/progress';
|
||||||
import Severity from 'vs/base/common/severity';
|
import Severity from 'vs/base/common/severity';
|
||||||
import { IPaneComposite } from 'vs/workbench/common/panecomposite';
|
import { IPaneComposite } from 'vs/workbench/common/panecomposite';
|
||||||
|
|||||||
Reference in New Issue
Block a user