@@ -33,7 +33,7 @@ export const roundUp = (num: number, decimals: number) =>
3333export 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
8888export 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
127130export 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
143148export 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