Path: blob/main/scripts/chat-simulation/fixtures/_chatperf_arrays.ts
13383 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45// perf-benchmark-marker67/**8* Fixture for chat-simulation benchmarks.9* Simplified from src/vs/base/common/arrays.ts for stable perf testing.10*/1112export function coalesce<T>(array: ReadonlyArray<T | undefined | null>): T[] {13return array.filter((e): e is T => e !== undefined && e !== null);14}1516export function groupBy<T>(data: ReadonlyArray<T>, groupFn: (element: T) => string): { [key: string]: T[] } {17const result: { [key: string]: T[] } = {};18for (const element of data) {19const key = groupFn(element);20(result[key] ??= []).push(element);21}22return result;23}2425export function distinct<T>(array: ReadonlyArray<T>, keyFn: (t: T) => any = t => t): T[] {26const seen = new Set<any>();27return array.filter(element => {28const key = keyFn(element);29if (seen.has(key)) { return false; }30seen.add(key);31return true;32});33}3435export function firstOrDefault<T>(array: ReadonlyArray<T>): T | undefined;36export function firstOrDefault<T>(array: ReadonlyArray<T>, defaultValue: T): T;37export function firstOrDefault<T>(array: ReadonlyArray<T>, defaultValue?: T): T | undefined {38return array.length > 0 ? array[0] : defaultValue;39}4041export function lastOrDefault<T>(array: ReadonlyArray<T>): T | undefined;42export function lastOrDefault<T>(array: ReadonlyArray<T>, defaultValue: T): T;43export function lastOrDefault<T>(array: ReadonlyArray<T>, defaultValue?: T): T | undefined {44return array.length > 0 ? array[array.length - 1] : defaultValue;45}4647export function binarySearch<T>(array: ReadonlyArray<T>, key: T, comparator: (a: T, b: T) => number): number {48let low = 0;49let high = array.length - 1;50while (low <= high) {51const mid = ((low + high) / 2) | 0;52const comp = comparator(array[mid], key);53if (comp < 0) { low = mid + 1; }54else if (comp > 0) { high = mid - 1; }55else { return mid; }56}57return -(low + 1);58}5960export function insertSorted<T>(array: T[], element: T, comparator: (a: T, b: T) => number): void {61const idx = binarySearch(array, element, comparator);62const insertIdx = idx < 0 ? ~idx : idx;63array.splice(insertIdx, 0, element);64}6566export function flatten<T>(arr: T[][]): T[] {67return ([] as T[]).concat(...arr);68}6970export function range(to: number): number[];71export function range(from: number, to: number): number[];72export function range(arg: number, to?: number): number[] {73const from = to !== undefined ? arg : 0;74const end = to !== undefined ? to : arg;75const result: number[] = [];76for (let i = from; i < end; i++) { result.push(i); }77return result;78}7980export function tail<T>(array: T[]): [T[], T] {81if (array.length === 0) { throw new Error('Invalid tail call'); }82return [array.slice(0, array.length - 1), array[array.length - 1]];83}848586