Skip to content

Commit c98bc39

Browse files
committed
✨ use ReadonlyArray wherever possible
1 parent ef82090 commit c98bc39

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

src/lang.ts

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export const roundUp = (num: number, decimals: number) =>
3333
export const roundDown = (num: number, decimals: number) =>
3434
Math.floor((num + Number.EPSILON) * 10 ** decimals) / 10 ** decimals;
3535

36-
export const SortBy = <T>(...fns: KeyFn<T>[]): CompareFn<T> => {
36+
export const SortBy = <T>(...fns: ReadonlyArray<KeyFn<T>>): CompareFn<T> => {
3737
if (fns.length === 1) {
3838
const fn = fns[0];
3939
return (a, b) => compareWithKey(a, b, fn);
@@ -72,7 +72,7 @@ function compareWithKey<T, V = number | string>(
7272
* @param items
7373
* @returns distinct items (preserves order)
7474
*/
75-
export const unique = <T>(items: T[]): T[] => {
75+
export const unique = <T>(items: ReadonlyArray<T>): T[] => {
7676
const seen = new Set<T>();
7777
const resp: T[] = [];
7878
for (const item of items) {
@@ -86,7 +86,7 @@ export const unique = <T>(items: T[]): T[] => {
8686
};
8787

8888
export const uniqueBy = <T, V = string | number>(
89-
items: T[],
89+
items: ReadonlyArray<T>,
9090
fn: KeyFn<T, V>,
9191
): T[] => {
9292
const seen = new Set<V>();
@@ -102,7 +102,7 @@ export const uniqueBy = <T, V = string | number>(
102102
return resp;
103103
};
104104

105-
export const uniqueCount = <T>(items: T[]): number => {
105+
export const uniqueCount = <T>(items: ReadonlyArray<T>): number => {
106106
const seen = new Set<T>();
107107
for (const item of items) {
108108
if (seen.has(item)) {
@@ -113,7 +113,10 @@ export const uniqueCount = <T>(items: T[]): number => {
113113
return seen.size;
114114
};
115115

116-
export const intersection = <T>(items1: T[], items2: T[]) => {
116+
export const intersection = <T>(
117+
items1: ReadonlyArray<T>,
118+
items2: ReadonlyArray<T>,
119+
) => {
117120
const items2Set = new Set(items2);
118121
const inters = new Set<T>();
119122
for (const s1 of items1) {
@@ -126,7 +129,9 @@ export const intersection = <T>(items1: T[], items2: T[]) => {
126129

127130
export type IntSequence = [number, number];
128131

129-
export const arrayToIntSequence = (arr: number[]): IntSequence[] => {
132+
export const arrayToIntSequence = (
133+
arr: ReadonlyArray<number>,
134+
): IntSequence[] => {
130135
arr = [...arr].sort(SortBy((x) => x));
131136
const seqs: [number, number][] = [];
132137
for (const item of arr) {
@@ -141,8 +146,8 @@ export const arrayToIntSequence = (arr: number[]): IntSequence[] => {
141146
};
142147

143148
export const areIntSequencesOverlapping = (
144-
s1: IntSequence[],
145-
s2: IntSequence[],
149+
s1: ReadonlyArray<IntSequence>,
150+
s2: ReadonlyArray<IntSequence>,
146151
) => {
147152
for (const p1 of s1) {
148153
for (const p2 of s2) {
@@ -181,7 +186,10 @@ export const groupBy = <T, U, V = T[]>(
181186
return map;
182187
};
183188

184-
export const setEquals = <T>(items1: T[], items2: T[]) => {
189+
export const setEquals = <T>(
190+
items1: ReadonlyArray<T>,
191+
items2: ReadonlyArray<T>,
192+
) => {
185193
for (const i1 of items1) {
186194
if (items2.indexOf(i1) === -1) {
187195
return false;
@@ -195,7 +203,10 @@ export const setEquals = <T>(items1: T[], items2: T[]) => {
195203
return true;
196204
};
197205

198-
export const minBy = <T>(items: T[], ...fn: KeyFn<T>[]): T | null => {
206+
export const minBy = <T>(
207+
items: ReadonlyArray<T>,
208+
...fn: ReadonlyArray<KeyFn<T>>
209+
): T | null => {
199210
let s: T | null = null;
200211
const comparator = SortBy(...fn);
201212
for (const item of items) {
@@ -206,7 +217,10 @@ export const minBy = <T>(items: T[], ...fn: KeyFn<T>[]): T | null => {
206217
return s;
207218
};
208219

209-
export const maxBy = <T>(items: T[], ...fn: KeyFn<T>[]): T | null => {
220+
export const maxBy = <T>(
221+
items: ReadonlyArray<T>,
222+
...fn: ReadonlyArray<KeyFn<T>>
223+
): T | null => {
210224
let s: T | null = null;
211225
const comparator = SortBy(...fn);
212226
for (const item of items) {
@@ -217,15 +231,21 @@ export const maxBy = <T>(items: T[], ...fn: KeyFn<T>[]): T | null => {
217231
return s;
218232
};
219233

220-
export const sumBy = <T>(items: T[], fn: (x: T) => number): number => {
234+
export const sumBy = <T>(
235+
items: ReadonlyArray<T>,
236+
fn: (x: T) => number,
237+
): number => {
221238
let s = 0;
222239
for (const item of items) {
223240
s += fn(item);
224241
}
225242
return s;
226243
};
227244

228-
export const countBy = <T>(items: T[], fn: (x: T) => boolean): number => {
245+
export const countBy = <T>(
246+
items: ReadonlyArray<T>,
247+
fn: (x: T) => boolean,
248+
): number => {
229249
let s = 0;
230250
for (const item of items) {
231251
if (fn(item)) {
@@ -235,7 +255,7 @@ export const countBy = <T>(items: T[], fn: (x: T) => boolean): number => {
235255
return s;
236256
};
237257

238-
export function shuffleArray<T>(array: T[]) {
258+
export function shuffleArray<T>(array: ReadonlyArray<T>) {
239259
const output = [...array];
240260
for (let i = output.length - 1; i > 0; i--) {
241261
const j = Math.floor(Math.random() * (i + 1));
@@ -246,7 +266,7 @@ export function shuffleArray<T>(array: T[]) {
246266
return output;
247267
}
248268

249-
export function selectRandom<T>(array: T[]) {
269+
export function selectRandom<T>(array: ReadonlyArray<T>) {
250270
const index = Math.floor(Math.random() * (array.length + 1));
251271
return array[Math.min(index, array.length - 1)];
252272
}

0 commit comments

Comments
 (0)