export type Comparer = (a: T, b: T) => number /* (-1 | 0 | 1) */; export type KeyValueComparer = Comparer; export function keyValueComparer(keyComparer: Comparer, valueComparer?: Comparer): KeyValueComparer { return function innerKeyValueComparer([aKey, aValue]: readonly [TKey, TObject], [bKey, bValue]: readonly [TKey, TObject]) { if (valueComparer) { const result = valueComparer(aValue, bValue); if (result !== 0) { return result; } } return keyComparer(aKey, bKey); }; } export function defaultComparer(a: T, b: T) { return a === b ? 0 : a > b ? 1 : -1; }