Skip to content

Commit 3399caa

Browse files
committed
feat(asyncEqualOnce): add asyncEqualOnce function
1 parent 7a692d8 commit 3399caa

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

index.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
asyncDropUntilOnce,
66
asyncDropWhileOnce,
77
asyncEmptyOnce,
8+
asyncEqualOnce,
89
asyncInitialOnce,
910
asyncIterator,
1011
asyncLastOnce,
@@ -284,3 +285,23 @@ test("asyncDropUntilOnce", async t => {
284285
[4, 3, 2, 1]
285286
);
286287
});
288+
289+
test("asyncEqualOnce", async t => {
290+
t.true(await asyncEqualOnce(asyncIterator([1, 2, 3]), asyncIterator([1, 2, 3])));
291+
t.false(await asyncEqualOnce(asyncIterator([1, 2, 3]), asyncIterator([1, 2, 3, 4])));
292+
t.false(await asyncEqualOnce(asyncIterator([1, 2, 3, 4]), asyncIterator([1, 2, 3])));
293+
t.false(await asyncEqualOnce(asyncIterator([1, 3, 3]), asyncIterator([1, 2, 3])));
294+
t.true(
295+
await asyncEqualOnce(
296+
asyncIterator([asyncIterator([1, 2]), asyncIterator([3, 4])]),
297+
asyncIterator([asyncIterator([1, 2]), asyncIterator([3, 4])]),
298+
asyncEqualOnce
299+
)
300+
);
301+
t.false(
302+
await asyncEqualOnce(
303+
asyncIterator([asyncIterator([1, 2]), asyncIterator([3, 4])]),
304+
asyncIterator([asyncIterator([1, 2]), asyncIterator([3, 4])])
305+
)
306+
);
307+
});

index.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import {equal as defaultEqual} from "@softwareventures/ordered";
12
import type {AsyncIterableLike} from "@softwareventures/async-iterable";
23
import {hasProperty} from "unknown";
34
import {asyncIterable} from "@softwareventures/async-iterable";
@@ -420,3 +421,30 @@ export function asyncDropUntilOnceFn<T>(
420421
): (iterator: AsyncIteratorLike<T>) => AsyncIterator<T> {
421422
return iterator => asyncDropUntilOnce(iterator, predicate);
422423
}
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+
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
},
2424
"dependencies": {
2525
"@softwareventures/async-iterable": "^1.0.1",
26+
"@softwareventures/ordered": "^2.0.0",
2627
"tslib": "2.4.0",
2728
"unknown": "^0.2.5"
2829
},

yarn.lock

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,7 @@ __metadata:
854854
"@commitlint/cz-commitlint": 17.1.2
855855
"@softwareventures/async-iterable": ^1.0.1
856856
"@softwareventures/eslint-config": 7.0.0
857+
"@softwareventures/ordered": ^2.0.0
857858
"@softwareventures/precise-commits": 2.0.22
858859
"@softwareventures/prettier-config": 3.0.0
859860
"@softwareventures/semantic-release-config": 2.0.2
@@ -927,7 +928,7 @@ __metadata:
927928
languageName: node
928929
linkType: hard
929930

930-
"@softwareventures/ordered@npm:^1.1.0 || ^2.0.0":
931+
"@softwareventures/ordered@npm:^1.1.0 || ^2.0.0, @softwareventures/ordered@npm:^2.0.0":
931932
version: 2.0.0
932933
resolution: "@softwareventures/ordered@npm:2.0.0"
933934
dependencies:

0 commit comments

Comments
 (0)