@@ -16,6 +16,10 @@ namespace ts {
1616 [ index : string ] : T ;
1717 }
1818
19+ export interface SortedReadonlyArray < T > extends ReadonlyArray < T > {
20+ " __sortedArrayBrand" : any ;
21+ }
22+
1923 export interface SortedArray < T > extends Array < T > {
2024 " __sortedArrayBrand" : any ;
2125 }
@@ -815,8 +819,8 @@ namespace ts {
815819 /**
816820 * Deduplicates an array that has already been sorted.
817821 */
818- function deduplicateSorted < T > ( array : ReadonlyArray < T > , comparer : EqualityComparer < T > | Comparer < T > ) : T [ ] {
819- if ( array . length === 0 ) return [ ] ;
822+ function deduplicateSorted < T > ( array : SortedReadonlyArray < T > , comparer : EqualityComparer < T > | Comparer < T > ) : SortedReadonlyArray < T > {
823+ if ( array . length === 0 ) return emptyArray as any as SortedReadonlyArray < T > ;
820824
821825 let last = array [ 0 ] ;
822826 const deduplicated : T [ ] = [ last ] ;
@@ -838,7 +842,7 @@ namespace ts {
838842 deduplicated . push ( last = next ) ;
839843 }
840844
841- return deduplicated ;
845+ return deduplicated as any as SortedReadonlyArray < T > ;
842846 }
843847
844848 export function insertSorted < T > ( array : SortedArray < T > , insert : T , compare : Comparer < T > ) : void {
@@ -853,8 +857,10 @@ namespace ts {
853857 }
854858 }
855859
856- export function sortAndDeduplicate < T > ( array : ReadonlyArray < T > , comparer : Comparer < T > , equalityComparer ?: EqualityComparer < T > ) {
857- return deduplicateSorted ( sort ( array , comparer ) , equalityComparer || comparer ) ;
860+ export function sortAndDeduplicate < T > ( array : ReadonlyArray < string > ) : SortedReadonlyArray < string > ;
861+ export function sortAndDeduplicate < T > ( array : ReadonlyArray < T > , comparer : Comparer < T > , equalityComparer ?: EqualityComparer < T > ) : SortedReadonlyArray < T > ;
862+ export function sortAndDeduplicate < T > ( array : ReadonlyArray < T > , comparer ?: Comparer < T > , equalityComparer ?: EqualityComparer < T > ) : SortedReadonlyArray < T > {
863+ return deduplicateSorted ( sort ( array , comparer ) , equalityComparer || comparer || compareStringsCaseSensitive as any as Comparer < T > ) ;
858864 }
859865
860866 export function arrayIsEqualTo < T > ( array1 : ReadonlyArray < T > | undefined , array2 : ReadonlyArray < T > | undefined , equalityComparer : ( a : T , b : T , index : number ) => boolean = equateValues ) : boolean {
@@ -1035,8 +1041,8 @@ namespace ts {
10351041 /**
10361042 * Returns a new sorted array.
10371043 */
1038- export function sort < T > ( array : ReadonlyArray < T > , comparer : Comparer < T > ) : T [ ] {
1039- return array . slice ( ) . sort ( comparer ) ;
1044+ export function sort < T > ( array : ReadonlyArray < T > , comparer ? : Comparer < T > ) : SortedReadonlyArray < T > {
1045+ return ( array . length === 0 ? array : array . slice ( ) . sort ( comparer ) ) as SortedReadonlyArray < T > ;
10401046 }
10411047
10421048 export function arrayIterator < T > ( array : ReadonlyArray < T > ) : Iterator < T > {
0 commit comments