|
| 1 | +import {equal as defaultEqual} from "@softwareventures/ordered"; |
1 | 2 | import type {AsyncIterableLike} from "@softwareventures/async-iterable"; |
2 | 3 | import {hasProperty} from "unknown"; |
3 | 4 | import {asyncIterable} from "@softwareventures/async-iterable"; |
@@ -420,3 +421,30 @@ export function asyncDropUntilOnceFn<T>( |
420 | 421 | ): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> { |
421 | 422 | return iterator => asyncDropUntilOnce(iterator, predicate); |
422 | 423 | } |
| 424 | + |
| 425 | +export async function asyncEqualOnce<T>( |
| 426 | + a: AsyncIteratorLike<T>, |
| 427 | + b: AsyncIteratorLike<T>, |
| 428 | + elementsEqual: (a: T, b: T) => boolean | Promise<boolean> = defaultEqual |
| 429 | +): Promise<boolean> { |
| 430 | + const ait = asyncIterator(a); |
| 431 | + const bit = asyncIterator(b); |
| 432 | + let aElement = await ait.next(); |
| 433 | + let bElement = await bit.next(); |
| 434 | + while ( |
| 435 | + aElement.done !== true && |
| 436 | + bElement.done !== true && |
| 437 | + (await elementsEqual(aElement.value, bElement.value)) |
| 438 | + ) { |
| 439 | + aElement = await ait.next(); |
| 440 | + bElement = await bit.next(); |
| 441 | + } |
| 442 | + return aElement.done === true && bElement.done === true; |
| 443 | +} |
| 444 | + |
| 445 | +export function asyncEqualOnceFn<T>( |
| 446 | + b: AsyncIteratorLike<T>, |
| 447 | + elementsEqual: (a: T, b: T) => boolean | Promise<boolean> = defaultEqual |
| 448 | +): (a: AsyncIteratorLike<T>) => Promise<boolean> { |
| 449 | + return async a => asyncEqualOnce(a, b, elementsEqual); |
| 450 | +} |
0 commit comments