From 239d6c040d2947f3b2ea0caf2b0b4bee09d97337 Mon Sep 17 00:00:00 2001 From: Bodhi <106667397+RareBodhi@users.noreply.github.com> Date: Mon, 13 May 2024 12:06:26 +0700 Subject: [PATCH] Chunk difference methods (#2658) Co-authored-by: Tim --- .changeset/four-garlics-wonder.md | 5 +++++ packages/effect/src/Chunk.ts | 30 ++++++++++++++++++++++++++++++ packages/effect/test/Chunk.test.ts | 23 +++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 .changeset/four-garlics-wonder.md diff --git a/.changeset/four-garlics-wonder.md b/.changeset/four-garlics-wonder.md new file mode 100644 index 0000000000..184d460ae4 --- /dev/null +++ b/.changeset/four-garlics-wonder.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +add Chunk.difference & Chunk.differenceWith diff --git a/packages/effect/src/Chunk.ts b/packages/effect/src/Chunk.ts index 1ee6cbd18d..cb6ccff319 100644 --- a/packages/effect/src/Chunk.ts +++ b/packages/effect/src/Chunk.ts @@ -1387,3 +1387,33 @@ export const reduceRight: { (b: B, f: (b: B, a: A, i: number) => B): (self: Chunk) => B (self: Chunk, b: B, f: (b: B, a: A, i: number) => B): B } = RA.reduceRight + +/** + * Creates a `Chunk` of values not included in the other given `Chunk` using the provided `isEquivalent` function. + * The order and references of result values are determined by the first `Chunk`. + * + * @since 3.2.0 + */ +export const differenceWith = (isEquivalent: (self: A, that: A) => boolean): { + (that: Chunk): (self: Chunk) => Chunk + (self: Chunk, that: Chunk): Chunk +} => { + return dual( + 2, + (self: Chunk, that: Chunk): Chunk => unsafeFromArray(RA.differenceWith(isEquivalent)(that, self)) + ) +} + +/** + * Creates a `Chunk` of values not included in the other given `Chunk`. + * The order and references of result values are determined by the first `Chunk`. + * + * @since 3.2.0 + */ +export const difference: { + (that: Chunk): (self: Chunk) => Chunk + (self: Chunk, that: Chunk): Chunk +} = dual( + 2, + (self: Chunk, that: Chunk): Chunk => unsafeFromArray(RA.difference(that, self)) +) diff --git a/packages/effect/test/Chunk.test.ts b/packages/effect/test/Chunk.test.ts index ae6093a191..550003dff4 100644 --- a/packages/effect/test/Chunk.test.ts +++ b/packages/effect/test/Chunk.test.ts @@ -17,6 +17,8 @@ describe("Chunk", () => { expect(Chunk.unsafeFromNonEmptyArray).exist expect(Chunk.contains).exist expect(Chunk.containsWith).exist + expect(Chunk.difference).exist + expect(Chunk.differenceWith).exist expect(Chunk.findFirst).exist expect(Chunk.findFirstIndex).exist expect(Chunk.findLast).exist @@ -874,4 +876,25 @@ describe("Chunk", () => { expect(equivalence(Chunk.make(1, 2, 3), Chunk.make(1, 2))).toBe(false) expect(equivalence(Chunk.make(1, 2, 3), Chunk.make(1, 2, 4))).toBe(false) }) + + it("differenceWith", () => { + const eq = (a: E, b: E) => a.id === b.id + const diffW = pipe(eq, Chunk.differenceWith) + + const curr = Chunk.make({ id: 1 }, { id: 2 }, { id: 3 }) + + expect(diffW(Chunk.make({ id: 1 }, { id: 2 }), curr)).toEqual(Chunk.make({ id: 3 })) + expect(diffW(Chunk.empty(), curr)).toEqual(curr) + expect(diffW(curr, Chunk.empty())).toEqual(Chunk.empty()) + expect(diffW(curr, curr)).toEqual(Chunk.empty()) + }) + + it("difference", () => { + const curr = Chunk.make(1, 3, 5, 7, 9) + + expect(Chunk.difference(Chunk.make(1, 2, 3, 4, 5), curr)).toEqual(Chunk.make(7, 9)) + expect(Chunk.difference(Chunk.empty(), curr)).toEqual(curr) + expect(Chunk.difference(curr, Chunk.empty())).toEqual(Chunk.empty()) + expect(Chunk.difference(curr, curr)).toEqual(Chunk.empty()) + }) })