diff --git a/packages/effect/src/HashMap.ts b/packages/effect/src/HashMap.ts index cbd3dab8836..36450a199e5 100644 --- a/packages/effect/src/HashMap.ts +++ b/packages/effect/src/HashMap.ts @@ -442,3 +442,17 @@ export const findFirst: { (self: HashMap, predicate: (a: A, k: K) => a is B): Option<[K, B]> (self: HashMap, predicate: (a: A, k: K) => boolean): Option<[K, A]> } = HM.findFirst + +/** + * Checks if any entry in a hashmap meets a specific condition. + * + * @param self - The hashmap to check. + * @param predicate - The condition to test entries (value, key). + * + * @since 3.13.0 + * @category elements + */ +export const some: { + (predicate: (a: NoInfer, k: K) => boolean): (self: HashMap) => boolean + (self: HashMap, predicate: (a: A, k: K) => boolean): boolean +} = HM.some diff --git a/packages/effect/src/internal/hashMap.ts b/packages/effect/src/internal/hashMap.ts index f61e638da32..6fd9c16ee07 100644 --- a/packages/effect/src/internal/hashMap.ts +++ b/packages/effect/src/internal/hashMap.ts @@ -539,3 +539,19 @@ export const findFirst: { return Option.none() } ) + +/** @internal */ +export const some: { + (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 => { + for (const ka of self) { + if (predicate(ka[1], ka[0])) { + return true + } + } + return false + } +) diff --git a/packages/effect/test/HashMap.test.ts b/packages/effect/test/HashMap.test.ts index 98b760d2fa3..f979bd937f2 100644 --- a/packages/effect/test/HashMap.test.ts +++ b/packages/effect/test/HashMap.test.ts @@ -284,6 +284,19 @@ describe("HashMap", () => { deepStrictEqual(HM.get(key(2))(result), Option.none()) }) + it("some", () => { + const mapWith3LettersMax = HM.make([0, "a"], [1, "bb"], [3, "ccc"]) + + deepStrictEqual(HM.some(mapWith3LettersMax, (value) => value.length > 3), false) + deepStrictEqual(pipe(mapWith3LettersMax, HM.some((value) => value.length > 3)), false) + + deepStrictEqual(HM.some(mapWith3LettersMax, (value) => value.length > 1), true) + + deepStrictEqual(HM.some(mapWith3LettersMax, (value, key) => value.length > 1 && key === 0), false) + + deepStrictEqual(HM.some(mapWith3LettersMax, (value, key) => value.length > 1 && key === 1), 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))