(elementComparator)
| 95 | * @returns {Comparator<Iterable<T>>} comparator for iterables of elements |
| 96 | */ |
| 97 | const compareIterables = (elementComparator) => { |
| 98 | const cacheEntry = compareIteratorsCache.get(elementComparator); |
| 99 | if (cacheEntry !== undefined) return cacheEntry; |
| 100 | /** |
| 101 | * Returns compare result. |
| 102 | * @param {Iterable<T>} a first value |
| 103 | * @param {Iterable<T>} b second value |
| 104 | * @returns {-1 | 0 | 1} compare result |
| 105 | */ |
| 106 | const result = (a, b) => { |
| 107 | const aI = a[Symbol.iterator](); |
| 108 | const bI = b[Symbol.iterator](); |
| 109 | while (true) { |
| 110 | const aItem = aI.next(); |
| 111 | const bItem = bI.next(); |
| 112 | if (aItem.done) { |
| 113 | return bItem.done ? 0 : -1; |
| 114 | } else if (bItem.done) { |
| 115 | return 1; |
| 116 | } |
| 117 | const res = elementComparator(aItem.value, bItem.value); |
| 118 | if (res !== 0) return res; |
| 119 | } |
| 120 | }; |
| 121 | compareIteratorsCache.set(elementComparator, result); |
| 122 | return result; |
| 123 | }; |
| 124 | |
| 125 | /** |
| 126 | * Compare two locations |
no test coverage detected