Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/scripts/chat-simulation/fixtures/_chatperf_arrays.ts
13383 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
// perf-benchmark-marker
7
8
/**
9
* Fixture for chat-simulation benchmarks.
10
* Simplified from src/vs/base/common/arrays.ts for stable perf testing.
11
*/
12
13
export function coalesce<T>(array: ReadonlyArray<T | undefined | null>): T[] {
14
return array.filter((e): e is T => e !== undefined && e !== null);
15
}
16
17
export function groupBy<T>(data: ReadonlyArray<T>, groupFn: (element: T) => string): { [key: string]: T[] } {
18
const result: { [key: string]: T[] } = {};
19
for (const element of data) {
20
const key = groupFn(element);
21
(result[key] ??= []).push(element);
22
}
23
return result;
24
}
25
26
export function distinct<T>(array: ReadonlyArray<T>, keyFn: (t: T) => any = t => t): T[] {
27
const seen = new Set<any>();
28
return array.filter(element => {
29
const key = keyFn(element);
30
if (seen.has(key)) { return false; }
31
seen.add(key);
32
return true;
33
});
34
}
35
36
export function firstOrDefault<T>(array: ReadonlyArray<T>): T | undefined;
37
export function firstOrDefault<T>(array: ReadonlyArray<T>, defaultValue: T): T;
38
export function firstOrDefault<T>(array: ReadonlyArray<T>, defaultValue?: T): T | undefined {
39
return array.length > 0 ? array[0] : defaultValue;
40
}
41
42
export function lastOrDefault<T>(array: ReadonlyArray<T>): T | undefined;
43
export function lastOrDefault<T>(array: ReadonlyArray<T>, defaultValue: T): T;
44
export function lastOrDefault<T>(array: ReadonlyArray<T>, defaultValue?: T): T | undefined {
45
return array.length > 0 ? array[array.length - 1] : defaultValue;
46
}
47
48
export function binarySearch<T>(array: ReadonlyArray<T>, key: T, comparator: (a: T, b: T) => number): number {
49
let low = 0;
50
let high = array.length - 1;
51
while (low <= high) {
52
const mid = ((low + high) / 2) | 0;
53
const comp = comparator(array[mid], key);
54
if (comp < 0) { low = mid + 1; }
55
else if (comp > 0) { high = mid - 1; }
56
else { return mid; }
57
}
58
return -(low + 1);
59
}
60
61
export function insertSorted<T>(array: T[], element: T, comparator: (a: T, b: T) => number): void {
62
const idx = binarySearch(array, element, comparator);
63
const insertIdx = idx < 0 ? ~idx : idx;
64
array.splice(insertIdx, 0, element);
65
}
66
67
export function flatten<T>(arr: T[][]): T[] {
68
return ([] as T[]).concat(...arr);
69
}
70
71
export function range(to: number): number[];
72
export function range(from: number, to: number): number[];
73
export function range(arg: number, to?: number): number[] {
74
const from = to !== undefined ? arg : 0;
75
const end = to !== undefined ? to : arg;
76
const result: number[] = [];
77
for (let i = from; i < end; i++) { result.push(i); }
78
return result;
79
}
80
81
export function tail<T>(array: T[]): [T[], T] {
82
if (array.length === 0) { throw new Error('Invalid tail call'); }
83
return [array.slice(0, array.length - 1), array[array.length - 1]];
84
}
85
86