Use ReadonlyArray in more places
parent
a179a4f126
commit
1edc8c6ff9
|
@ -46,7 +46,7 @@ export function equals<T>(one: ReadonlyArray<T> | undefined, other: ReadonlyArra
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function binarySearch<T>(array: T[], key: T, comparator: (op1: T, op2: T) => number): number {
|
export function binarySearch<T>(array: ReadonlyArray<T>, key: T, comparator: (op1: T, op2: T) => number): number {
|
||||||
let low = 0,
|
let low = 0,
|
||||||
high = array.length - 1;
|
high = array.length - 1;
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ export function binarySearch<T>(array: T[], key: T, comparator: (op1: T, op2: T)
|
||||||
* are located before all elements where p(x) is true.
|
* are located before all elements where p(x) is true.
|
||||||
* @returns the least x for which p(x) is true or array.length if no element fullfills the given function.
|
* @returns the least x for which p(x) is true or array.length if no element fullfills the given function.
|
||||||
*/
|
*/
|
||||||
export function findFirstInSorted<T>(array: T[], p: (x: T) => boolean): number {
|
export function findFirstInSorted<T>(array: ReadonlyArray<T>, p: (x: T) => boolean): number {
|
||||||
let low = 0, high = array.length;
|
let low = 0, high = array.length;
|
||||||
if (high === 0) {
|
if (high === 0) {
|
||||||
return 0; // no children
|
return 0; // no children
|
||||||
|
@ -135,7 +135,7 @@ function _sort<T>(a: T[], compare: Compare<T>, lo: number, hi: number, aux: T[])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function groupBy<T>(data: T[], compare: (a: T, b: T) => number): T[][] {
|
export function groupBy<T>(data: ReadonlyArray<T>, compare: (a: T, b: T) => number): T[][] {
|
||||||
const result: T[][] = [];
|
const result: T[][] = [];
|
||||||
let currentGroup: T[] | undefined = undefined;
|
let currentGroup: T[] | undefined = undefined;
|
||||||
for (const element of mergeSort(data.slice(0), compare)) {
|
for (const element of mergeSort(data.slice(0), compare)) {
|
||||||
|
@ -156,7 +156,7 @@ interface IMutableSplice<T> extends ISplice<T> {
|
||||||
/**
|
/**
|
||||||
* Diffs two *sorted* arrays and computes the splices which apply the diff.
|
* Diffs two *sorted* arrays and computes the splices which apply the diff.
|
||||||
*/
|
*/
|
||||||
export function sortedDiff<T>(before: T[], after: T[], compare: (a: T, b: T) => number): ISplice<T>[] {
|
export function sortedDiff<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): ISplice<T>[] {
|
||||||
const result: IMutableSplice<T>[] = [];
|
const result: IMutableSplice<T>[] = [];
|
||||||
|
|
||||||
function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
|
function pushSplice(start: number, deleteCount: number, toInsert: T[]): void {
|
||||||
|
@ -215,7 +215,7 @@ export function sortedDiff<T>(before: T[], after: T[], compare: (a: T, b: T) =>
|
||||||
* @param after
|
* @param after
|
||||||
* @param compare
|
* @param compare
|
||||||
*/
|
*/
|
||||||
export function delta<T>(before: T[], after: T[], compare: (a: T, b: T) => number): { removed: T[], added: T[] } {
|
export function delta<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): { removed: T[], added: T[] } {
|
||||||
const splices = sortedDiff(before, after, compare);
|
const splices = sortedDiff(before, after, compare);
|
||||||
const removed: T[] = [];
|
const removed: T[] = [];
|
||||||
const added: T[] = [];
|
const added: T[] = [];
|
||||||
|
@ -238,7 +238,7 @@ export function delta<T>(before: T[], after: T[], compare: (a: T, b: T) => numbe
|
||||||
* @param n The number of elements to return.
|
* @param n The number of elements to return.
|
||||||
* @return The first n elemnts from array when sorted with compare.
|
* @return The first n elemnts from array when sorted with compare.
|
||||||
*/
|
*/
|
||||||
export function top<T>(array: T[], compare: (a: T, b: T) => number, n: number): T[] {
|
export function top<T>(array: ReadonlyArray<T>, compare: (a: T, b: T) => number, n: number): T[] {
|
||||||
if (n === 0) {
|
if (n === 0) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ export function topAsync<T>(array: T[], compare: (a: T, b: T) => number, n: numb
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function topStep<T>(array: T[], compare: (a: T, b: T) => number, result: T[], i: number, m: number): void {
|
function topStep<T>(array: ReadonlyArray<T>, compare: (a: T, b: T) => number, result: T[], i: number, m: number): void {
|
||||||
for (const n = result.length; i < m; i++) {
|
for (const n = result.length; i < m; i++) {
|
||||||
const element = array[i];
|
const element = array[i];
|
||||||
if (compare(element, result[n - 1]) < 0) {
|
if (compare(element, result[n - 1]) < 0) {
|
||||||
|
@ -348,7 +348,7 @@ export function isNonEmptyArray<T>(obj: ReadonlyArray<T> | undefined | null): ob
|
||||||
* Removes duplicates from the given array. The optional keyFn allows to specify
|
* Removes duplicates from the given array. The optional keyFn allows to specify
|
||||||
* how elements are checked for equalness by returning a unique string for each.
|
* how elements are checked for equalness by returning a unique string for each.
|
||||||
*/
|
*/
|
||||||
export function distinct<T>(array: T[], keyFn?: (t: T) => string): T[] {
|
export function distinct<T>(array: ReadonlyArray<T>, keyFn?: (t: T) => string): T[] {
|
||||||
if (!keyFn) {
|
if (!keyFn) {
|
||||||
return array.filter((element, position) => {
|
return array.filter((element, position) => {
|
||||||
return array.indexOf(element) === position;
|
return array.indexOf(element) === position;
|
||||||
|
@ -383,7 +383,7 @@ export function uniqueFilter<T>(keyFn: (t: T) => string): (t: T) => boolean {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function firstIndex<T>(array: T[] | ReadonlyArray<T>, fn: (item: T) => boolean): number {
|
export function firstIndex<T>(array: ReadonlyArray<T>, fn: (item: T) => boolean): number {
|
||||||
for (let i = 0; i < array.length; i++) {
|
for (let i = 0; i < array.length; i++) {
|
||||||
const element = array[i];
|
const element = array[i];
|
||||||
|
|
||||||
|
@ -395,14 +395,14 @@ export function firstIndex<T>(array: T[] | ReadonlyArray<T>, fn: (item: T) => bo
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function first<T>(array: T[] | ReadonlyArray<T>, fn: (item: T) => boolean, notFoundValue: T): T;
|
export function first<T>(array: ReadonlyArray<T>, fn: (item: T) => boolean, notFoundValue: T): T;
|
||||||
export function first<T>(array: T[] | ReadonlyArray<T>, fn: (item: T) => boolean): T | null;
|
export function first<T>(array: ReadonlyArray<T>, fn: (item: T) => boolean): T | null;
|
||||||
export function first<T>(array: T[] | ReadonlyArray<T>, fn: (item: T) => boolean, notFoundValue: T | null = null): T | null {
|
export function first<T>(array: ReadonlyArray<T>, fn: (item: T) => boolean, notFoundValue: T | null = null): T | null {
|
||||||
const index = firstIndex(array, fn);
|
const index = firstIndex(array, fn);
|
||||||
return index < 0 ? notFoundValue : array[index];
|
return index < 0 ? notFoundValue : array[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function commonPrefixLength<T>(one: T[], other: T[], equals: (a: T, b: T) => boolean = (a, b) => a === b): number {
|
export function commonPrefixLength<T>(one: ReadonlyArray<T>, other: ReadonlyArray<T>, equals: (a: T, b: T) => boolean = (a, b) => a === b): number {
|
||||||
let result = 0;
|
let result = 0;
|
||||||
|
|
||||||
for (let i = 0, len = Math.min(one.length, other.length); i < len && equals(one[i], other[i]); i++) {
|
for (let i = 0, len = Math.min(one.length, other.length); i < len && equals(one[i], other[i]); i++) {
|
||||||
|
@ -451,9 +451,9 @@ export function fill<T>(num: number, valueFn: () => T, arr: T[] = []): T[] {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function index<T>(array: T[], indexer: (t: T) => string): { [key: string]: T; };
|
export function index<T>(array: ReadonlyArray<T>, indexer: (t: T) => string): { [key: string]: T; };
|
||||||
export function index<T, R>(array: T[], indexer: (t: T) => string, merger?: (t: T, r: R) => R): { [key: string]: R; };
|
export function index<T, R>(array: ReadonlyArray<T>, indexer: (t: T) => string, merger?: (t: T, r: R) => R): { [key: string]: R; };
|
||||||
export function index<T, R>(array: T[], indexer: (t: T) => string, merger: (t: T, r: R) => R = t => t as any): { [key: string]: R; } {
|
export function index<T, R>(array: ReadonlyArray<T>, indexer: (t: T) => string, merger: (t: T, r: R) => R = t => t as any): { [key: string]: R; } {
|
||||||
return array.reduce((r, t) => {
|
return array.reduce((r, t) => {
|
||||||
const key = indexer(t);
|
const key = indexer(t);
|
||||||
r[key] = merger(t, r[key]);
|
r[key] = merger(t, r[key]);
|
||||||
|
|
Loading…
Reference in New Issue