@@ -98,6 +98,12 @@ export function last<T>(array: ArrayLike<T>): T | null {
9898 return array . length === 0 ? null : array [ array . length - 1 ] ;
9999}
100100
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+
101107export function empty < T > ( array : ArrayLike < T > ) : boolean {
102108 return array . length === 0 ;
103109}
@@ -182,6 +188,50 @@ export function dropWhileFn<T>(
182188 return array => dropWhile ( array , predicate ) ;
183189}
184190
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+
185235// eslint-disable-next-line @typescript-eslint/ban-ts-comment
186236// @ts -ignore duplicate identifier: This is the exported declaration, the implementation is below.
187237export function map < T , U > ( array : ArrayLike < T > , f : ( element : T , index : number ) => U ) : U [ ] ;
@@ -792,9 +842,10 @@ export function partitionWhileFn<T>(
792842 * If one of the supplied arrays is shorter than the other, then the excess
793843 * elements of the longer array will be discarded. */
794844export 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 ] ] ;
798849 }
799850 return result ;
800851}
@@ -1463,6 +1514,39 @@ export function shuffle<T>(array: ArrayLike<T>): T[] {
14631514 return result ;
14641515}
14651516
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+
14661550export function forEach < T > (
14671551 array : ArrayLike < T > ,
14681552 f : ( element : T , index : number ) => void
0 commit comments