(getter, comparator)
| 475 | * @returns {Comparator<T>} comparator |
| 476 | */ |
| 477 | const compareSelect = (getter, comparator) => { |
| 478 | const cacheEntry = compareSelectCache.get(getter, comparator); |
| 479 | if (cacheEntry !== undefined) return cacheEntry; |
| 480 | /** |
| 481 | * Returns compare result. |
| 482 | * @param {T} a first value |
| 483 | * @param {T} b second value |
| 484 | * @returns {-1 | 0 | 1} compare result |
| 485 | */ |
| 486 | const result = (a, b) => { |
| 487 | const aValue = getter(a); |
| 488 | const bValue = getter(b); |
| 489 | if (aValue !== undefined && aValue !== null) { |
| 490 | if (bValue !== undefined && bValue !== null) { |
| 491 | return comparator(aValue, bValue); |
| 492 | } |
| 493 | return -1; |
| 494 | } |
| 495 | if (bValue !== undefined && bValue !== null) { |
| 496 | return 1; |
| 497 | } |
| 498 | return 0; |
| 499 | }; |
| 500 | compareSelectCache.set(getter, comparator, result); |
| 501 | return result; |
| 502 | }; |
| 503 | |
| 504 | /** @type {WeakMap<Comparator<EXPECTED_ANY>, Comparator<Iterable<EXPECTED_ANY>>>} */ |
| 505 | const compareIteratorsCache = new WeakMap(); |
no test coverage detected