@@ -98,6 +98,12 @@ export function last<T>(array: ArrayLike<T>): T | null {
98
98
return array . length === 0 ? null : array [ array . length - 1 ] ;
99
99
}
100
100
101
+ /** If the array contains exactly one element, returns that element.
102
+ * Otherwise, returns null. */
103
+ export function only < T > ( array : ArrayLike < T > ) : T | null {
104
+ return array . length === 1 ? array [ 0 ] : null ;
105
+ }
106
+
101
107
export function empty < T > ( array : ArrayLike < T > ) : boolean {
102
108
return array . length === 0 ;
103
109
}
@@ -182,6 +188,50 @@ export function dropWhileFn<T>(
182
188
return array => dropWhile ( array , predicate ) ;
183
189
}
184
190
191
+ export function equal < T > (
192
+ a : ArrayLike < T > ,
193
+ b : ArrayLike < T > ,
194
+ elementsEqual : ( a : T , b : T ) => boolean = defaultEqual
195
+ ) : boolean {
196
+ if ( a . length !== b . length ) {
197
+ return false ;
198
+ }
199
+
200
+ for ( let i = 0 ; i < a . length ; ++ i ) {
201
+ if ( ! elementsEqual ( a [ i ] , b [ i ] ) ) {
202
+ return false ;
203
+ }
204
+ }
205
+
206
+ return true ;
207
+ }
208
+
209
+ export function equalFn < T > (
210
+ b : ArrayLike < T > ,
211
+ elementsEqual : ( a : T , b : T ) => boolean = defaultEqual
212
+ ) : ( a : ArrayLike < T > ) => boolean {
213
+ return a => equal ( a , b , elementsEqual ) ;
214
+ }
215
+
216
+ export function notEqual < T > (
217
+ a : ArrayLike < T > ,
218
+ b : ArrayLike < T > ,
219
+ elementsEqual : ( a : T , b : T ) => boolean = defaultEqual
220
+ ) : boolean {
221
+ return ! equal ( a , b , elementsEqual ) ;
222
+ }
223
+
224
+ export function notEqualFn < T > (
225
+ b : ArrayLike < T > ,
226
+ elementsEqual : ( a : T , b : T ) => boolean = defaultEqual
227
+ ) : ( a : ArrayLike < T > ) => boolean {
228
+ return a => notEqual ( a , b , elementsEqual ) ;
229
+ }
230
+
231
+ function defaultEqual ( a : unknown , b : unknown ) : boolean {
232
+ return a === b ;
233
+ }
234
+
185
235
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
186
236
// @ts -ignore duplicate identifier: This is the exported declaration, the implementation is below.
187
237
export function map < T , U > ( array : ArrayLike < T > , f : ( element : T , index : number ) => U ) : U [ ] ;
@@ -792,9 +842,10 @@ export function partitionWhileFn<T>(
792
842
* If one of the supplied arrays is shorter than the other, then the excess
793
843
* elements of the longer array will be discarded. */
794
844
export function zip < T , U > ( a : readonly T [ ] , b : readonly U [ ] ) : Array < [ T , U ] > {
795
- const result : Array < [ T , U ] > = [ ] ;
796
- for ( let i = 0 ; i < a . length && i < b . length ; ++ i ) {
797
- result . push ( [ a [ i ] , b [ i ] ] ) ;
845
+ const length = Math . min ( a . length , b . length ) ;
846
+ const result = new Array < [ T , U ] > ( length ) ;
847
+ for ( let i = 0 ; i < length ; ++ i ) {
848
+ result [ i ] = [ a [ i ] , b [ i ] ] ;
798
849
}
799
850
return result ;
800
851
}
@@ -1463,6 +1514,39 @@ export function shuffle<T>(array: ArrayLike<T>): T[] {
1463
1514
return result ;
1464
1515
}
1465
1516
1517
+ export function sort ( array : ArrayLike < boolean > ) : boolean [ ] ;
1518
+ export function sort ( array : ArrayLike < number > ) : number [ ] ;
1519
+ export function sort ( array : ArrayLike < string > ) : string [ ] ;
1520
+ export function sort < T > ( array : ArrayLike < T > , comparator : Comparator < T > ) : T [ ] ;
1521
+ export function sort < T > ( array : ArrayLike < T > , comparator ?: Comparator < T > ) : T [ ] {
1522
+ return copy ( array ) . sort ( comparator ?? ( defaultCompare as any ) ) ;
1523
+ }
1524
+
1525
+ export function sortFn < T > ( comparator : Comparator < T > ) : ( array : ArrayLike < T > ) => T [ ] {
1526
+ return array => sort ( array , comparator ) ;
1527
+ }
1528
+
1529
+ export function sortBy < T > ( array : ArrayLike < T > , select : SortSelect < T > ) : T [ ] {
1530
+ return sort ( array , ( a , b ) => defaultCompare ( select ( a ) as any , select ( b ) as any ) ) ;
1531
+ }
1532
+
1533
+ export function sortByFn < T > ( select : SortSelect < T > ) : ( array : ArrayLike < T > ) => T [ ] {
1534
+ return array => sortBy ( array , select ) ;
1535
+ }
1536
+
1537
+ export function sortByDescending < T > ( array : ArrayLike < T > , select : SortSelect < T > ) : T [ ] {
1538
+ return sort ( array , ( a , b ) => - defaultCompare ( select ( a ) as any , select ( b ) as any ) ) ;
1539
+ }
1540
+
1541
+ export function sortByDescendingFn < T > ( select : SortSelect < T > ) : ( array : ArrayLike < T > ) => T [ ] {
1542
+ return array => sortByDescending ( array , select ) ;
1543
+ }
1544
+
1545
+ export type SortSelect < T > =
1546
+ | ( ( element : T ) => boolean )
1547
+ | ( ( element : T ) => number )
1548
+ | ( ( element : T ) => string ) ;
1549
+
1466
1550
export function forEach < T > (
1467
1551
array : ArrayLike < T > ,
1468
1552
f : ( element : T , index : number ) => void
0 commit comments