| 16 | } |
| 17 | |
| 18 | export function areIterablesEqual<T>( |
| 19 | a: Iterable<T>, |
| 20 | b: Iterable<T>, |
| 21 | comparator: (a: T, b: T) => boolean, |
| 22 | ): boolean { |
| 23 | const iterator1 = a[Symbol.iterator](); |
| 24 | const iterator2 = b[Symbol.iterator](); |
| 25 | |
| 26 | while (true) { |
| 27 | const item1 = iterator1.next(); |
| 28 | const item2 = iterator2.next(); |
| 29 | if (item1.done && item2.done) return true; |
| 30 | if (item1.done || item2.done) return false; |
| 31 | if (!comparator(item1.value, item2.value)) return false; |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | export function iterateListLike<T>(obj: Iterable<T>, fn: (p: T) => void) { |
| 36 | if (Array.isArray(obj)) { |