From 0e4ac5d10ca34fa6aad2b8a57f93344446e06509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20Fran=C3=A7ois?= Date: Fri, 14 Feb 2025 01:15:31 +0100 Subject: [PATCH] Add HashMap.toValues and HashSet.toValues (#4317) --- .changeset/three-bees-attack.md | 5 +++++ packages/effect/src/HashMap.ts | 8 ++++++++ packages/effect/src/HashSet.ts | 8 ++++++++ packages/effect/src/internal/keyedPool.ts | 2 +- packages/effect/test/HashMap.test.ts | 7 +++++++ packages/effect/test/HashSet.test.ts | 8 ++++++++ packages/effect/test/utils/cache/WatchableLookup.ts | 2 +- 7 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 .changeset/three-bees-attack.md diff --git a/.changeset/three-bees-attack.md b/.changeset/three-bees-attack.md new file mode 100644 index 00000000000..53cf81c4110 --- /dev/null +++ b/.changeset/three-bees-attack.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Add `HashMap.toValues` and `HashSet.toValues` getters diff --git a/packages/effect/src/HashMap.ts b/packages/effect/src/HashMap.ts index 36450a199e5..d07c649c8f3 100644 --- a/packages/effect/src/HashMap.ts +++ b/packages/effect/src/HashMap.ts @@ -229,6 +229,14 @@ export const keySet: (self: HashMap) => HashSet = keySet_.keySet */ export const values: (self: HashMap) => IterableIterator = HM.values +/** + * Returns an `Array` of the values within the `HashMap`. + * + * @since 3.13.0 + * @category getters + */ +export const toValues = (self: HashMap): Array => Array.from(values(self)) + /** * Returns an `IterableIterator` of the entries within the `HashMap`. * diff --git a/packages/effect/src/HashSet.ts b/packages/effect/src/HashSet.ts index fb127fcceab..7b78245010e 100644 --- a/packages/effect/src/HashSet.ts +++ b/packages/effect/src/HashSet.ts @@ -115,6 +115,14 @@ export const isSubset: { */ export const values: (self: HashSet) => IterableIterator = HS.values +/** + * Returns an `Array` of the values within the `HashSet`. + * + * @since 3.13.0 + * @category getters + */ +export const toValues = (self: HashSet): Array => Array.from(values(self)) + /** * Calculates the number of values in the `HashSet`. * diff --git a/packages/effect/src/internal/keyedPool.ts b/packages/effect/src/internal/keyedPool.ts index 48db463242d..b91988b0771 100644 --- a/packages/effect/src/internal/keyedPool.ts +++ b/packages/effect/src/internal/keyedPool.ts @@ -174,7 +174,7 @@ const makeImpl = ( } }) const activePools: Effect.Effect>> = core.suspend(() => - core.forEachSequential(Array.from(HashMap.values(MutableRef.get(map))), (value) => { + core.forEachSequential(HashMap.toValues(MutableRef.get(map)), (value) => { switch (value._tag) { case "Complete": { return core.succeed(value.pool) diff --git a/packages/effect/test/HashMap.test.ts b/packages/effect/test/HashMap.test.ts index 21b5689f6ca..29d44a9387c 100644 --- a/packages/effect/test/HashMap.test.ts +++ b/packages/effect/test/HashMap.test.ts @@ -394,6 +394,13 @@ describe("HashMap", () => { deepStrictEqual(result, [value("a"), value("b")]) }) + it("toValues", () => { + const map = HM.make([key(0), value("a")], [key(1), value("b")]) + const result = HM.toValues(map) + + deepStrictEqual(result, [value("a"), value("b")]) + }) + it("entries", () => { const map = HM.make([key(0), value("a")], [key(1), value("b")]) const result = Array.from(HM.entries(map)) diff --git a/packages/effect/test/HashSet.test.ts b/packages/effect/test/HashSet.test.ts index b322028676b..a2f0bd77539 100644 --- a/packages/effect/test/HashSet.test.ts +++ b/packages/effect/test/HashSet.test.ts @@ -220,6 +220,14 @@ describe("HashSet", () => { deepStrictEqual(result, [value(0), value(1), value(2)]) }) + it("toValues", () => { + const hashSet = makeTestHashSet(0, 1, 2) + + const result = HashSet.toValues(hashSet) + + deepStrictEqual(result, [value(0), value(1), value(2)]) + }) + it("pipe()", () => { strictEqual( HashSet.empty().pipe(HashSet.add("value"), HashSet.size), diff --git a/packages/effect/test/utils/cache/WatchableLookup.ts b/packages/effect/test/utils/cache/WatchableLookup.ts index 94c12cfc722..b220034ae91 100644 --- a/packages/effect/test/utils/cache/WatchableLookup.ts +++ b/packages/effect/test/utils/cache/WatchableLookup.ts @@ -101,7 +101,7 @@ export const makeEffect = ( const assertAllCleaned = () => Effect.flatMap(createdResources(), (resources) => resourcesCleaned( - Chunk.flatten(Chunk.unsafeFromArray(Array.from(HashMap.values(resources)))) + Chunk.flatten(Chunk.unsafeFromArray(HashMap.toValues(resources))) )) const assertAllCleanedForKey = (key: Key) => Effect.flatMap(createdResources(), (resources) =>