From 866cd8b8e8497482319a02c46971d5d610fa20bb Mon Sep 17 00:00:00 2001 From: Laure Retru-Chavastel Date: Mon, 10 Mar 2025 22:59:55 +0100 Subject: [PATCH] Add `Hashmap.every` (#4513) --- .changeset/lemon-flies-hunt.md | 5 +++++ packages/effect/src/HashMap.ts | 14 ++++++++++++++ packages/effect/src/internal/hashMap.ts | 9 +++++++++ packages/effect/test/HashMap.test.ts | 13 +++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 .changeset/lemon-flies-hunt.md diff --git a/.changeset/lemon-flies-hunt.md b/.changeset/lemon-flies-hunt.md new file mode 100644 index 00000000000..8302ef83f60 --- /dev/null +++ b/.changeset/lemon-flies-hunt.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Add HashMap.every diff --git a/packages/effect/src/HashMap.ts b/packages/effect/src/HashMap.ts index c138bb7f1b6..420a6dfe85a 100644 --- a/packages/effect/src/HashMap.ts +++ b/packages/effect/src/HashMap.ts @@ -461,3 +461,17 @@ export const some: { (predicate: (a: NoInfer, k: K) => boolean): (self: HashMap) => boolean (self: HashMap, predicate: (a: A, k: K) => boolean): boolean } = HM.some + +/** + * Checks if all entries in a hashmap meets a specific condition. + * + * @param self - The hashmap to check. + * @param predicate - The condition to test entries (value, key). + * + * @since 3.14.0 + * @category elements + */ +export const every: { + (predicate: (a: NoInfer, k: K) => boolean): (self: HashMap) => boolean + (self: HashMap, predicate: (a: A, k: K) => boolean): boolean +} = HM.every diff --git a/packages/effect/src/internal/hashMap.ts b/packages/effect/src/internal/hashMap.ts index 6fd9c16ee07..fcbf0212fdc 100644 --- a/packages/effect/src/internal/hashMap.ts +++ b/packages/effect/src/internal/hashMap.ts @@ -555,3 +555,12 @@ export const some: { return false } ) + +/** @internal */ +export const every: { + (predicate: (a: NoInfer, k: K) => boolean): (self: HM.HashMap) => boolean + (self: HM.HashMap, predicate: (a: A, k: K) => boolean): boolean +} = Dual.dual( + 2, + (self: HM.HashMap, predicate: (a: A, k: K) => boolean): boolean => !some(self, (a, k) => !predicate(a, k)) +) diff --git a/packages/effect/test/HashMap.test.ts b/packages/effect/test/HashMap.test.ts index 29d44a9387c..67164ef4d44 100644 --- a/packages/effect/test/HashMap.test.ts +++ b/packages/effect/test/HashMap.test.ts @@ -296,6 +296,19 @@ describe("HashMap", () => { deepStrictEqual(HM.some(mapWith3LettersMax, (value, key) => value.length > 1 && key === 1), true) }) + it("every", () => { + const mapWith3LettersMax = HM.make([0, "a"], [1, "bb"], [3, "ccc"]) + + deepStrictEqual(HM.every(mapWith3LettersMax, (value) => value.length > 2), false) + deepStrictEqual(pipe(mapWith3LettersMax, HM.every((value) => value.length > 2)), false) + + deepStrictEqual(HM.every(mapWith3LettersMax, (value) => value.length >= 1), true) + + deepStrictEqual(HM.every(mapWith3LettersMax, (value, key) => value.length >= 1 && key === 0), false) + + deepStrictEqual(HM.every(mapWith3LettersMax, (value, key) => value.length >= 1 && key >= 0), true) + }) + it("reduce", () => { const map1 = HM.make([key(0), value("a")], [key(1), value("b")]) const result1 = pipe(map1, HM.reduce("", (acc, { s }) => acc.length > 0 ? `${acc},${s}` : s))