Skip to content

Commit b415577

Browse files
authoredFeb 14, 2024··
Fix internals of TestAnnotationsMap making it respect equality (#2138)
1 parent a663390 commit b415577

File tree

4 files changed

+28
-23
lines changed

4 files changed

+28
-23
lines changed
 

‎.changeset/tame-numbers-leave.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"effect": patch
3+
---
4+
5+
Fix internals of TestAnnotationsMap making it respect equality

‎packages/effect/src/TestAnnotation.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type * as MutableRef from "./MutableRef.js"
1212
import { hasProperty } from "./Predicate.js"
1313
import type * as SortedSet from "./SortedSet.js"
1414
import type * as Types from "./Types.js"
15+
1516
/** @internal */
1617
const TestAnnotationSymbolKey = "effect/TestAnnotation"
1718

‎packages/effect/src/TestAnnotationMap.ts

+19-23
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/**
22
* @since 2.0.0
33
*/
4-
import { dual, pipe } from "./Function.js"
4+
import { dual } from "./Function.js"
5+
import * as HashMap from "./HashMap.js"
56
import { hasProperty } from "./Predicate.js"
67
import type * as TestAnnotation from "./TestAnnotation.js"
78

@@ -23,13 +24,13 @@ export type TestAnnotationMapTypeId = typeof TestAnnotationMapTypeId
2324
export interface TestAnnotationMap {
2425
readonly [TestAnnotationMapTypeId]: TestAnnotationMapTypeId
2526
/** @internal */
26-
readonly map: ReadonlyMap<TestAnnotation.TestAnnotation<unknown>, unknown>
27+
readonly map: HashMap.HashMap<TestAnnotation.TestAnnotation<any>, any>
2728
}
2829

2930
/** @internal */
3031
class TestAnnotationMapImpl implements TestAnnotationMap {
3132
readonly [TestAnnotationMapTypeId]: TestAnnotationMapTypeId = TestAnnotationMapTypeId
32-
constructor(readonly map: ReadonlyMap<TestAnnotation.TestAnnotation<unknown>, unknown>) {
33+
constructor(readonly map: HashMap.HashMap<TestAnnotation.TestAnnotation<any>, any>) {
3334
}
3435
}
3536

@@ -41,12 +42,12 @@ export const isTestAnnotationMap = (u: unknown): u is TestAnnotationMap => hasPr
4142
/**
4243
* @since 2.0.0
4344
*/
44-
export const empty: (_: void) => TestAnnotationMap = () => new TestAnnotationMapImpl(new Map())
45+
export const empty: (_: void) => TestAnnotationMap = () => new TestAnnotationMapImpl(HashMap.empty())
4546

4647
/**
4748
* @since 2.0.0
4849
*/
49-
export const make = (map: ReadonlyMap<TestAnnotation.TestAnnotation<unknown>, unknown>): TestAnnotationMap => {
50+
export const make = (map: HashMap.HashMap<TestAnnotation.TestAnnotation<any>, any>): TestAnnotationMap => {
5051
return new TestAnnotationMapImpl(map)
5152
}
5253

@@ -56,11 +57,7 @@ export const make = (map: ReadonlyMap<TestAnnotation.TestAnnotation<unknown>, un
5657
export const overwrite = dual<
5758
<A>(key: TestAnnotation.TestAnnotation<A>, value: A) => (self: TestAnnotationMap) => TestAnnotationMap,
5859
<A>(self: TestAnnotationMap, key: TestAnnotation.TestAnnotation<A>, value: A) => TestAnnotationMap
59-
>(3, (self, key, value) =>
60-
make(
61-
(self.map as Map<TestAnnotation.TestAnnotation<unknown>, unknown>)
62-
.set(key as TestAnnotation.TestAnnotation<unknown>, value)
63-
))
60+
>(3, (self, key, value) => make(HashMap.set(self.map, key, value)))
6461

6562
/**
6663
* @since 2.0.0
@@ -69,11 +66,11 @@ export const update = dual<
6966
<A>(key: TestAnnotation.TestAnnotation<A>, f: (value: A) => A) => (self: TestAnnotationMap) => TestAnnotationMap,
7067
<A>(self: TestAnnotationMap, key: TestAnnotation.TestAnnotation<A>, f: (value: A) => A) => TestAnnotationMap
7168
>(3, <A>(self: TestAnnotationMap, key: TestAnnotation.TestAnnotation<A>, f: (value: A) => A) => {
72-
let value = self.map.get(key as TestAnnotation.TestAnnotation<unknown>)
73-
if (value === undefined) {
74-
value = key.initial
69+
let value = key.initial
70+
if (HashMap.has(self.map, key.identifier)) {
71+
value = HashMap.unsafeGet(self.map, key.identifier) as A
7572
}
76-
return pipe(self, overwrite(key, f(value as A)))
73+
return overwrite(self, key, f(value))
7774
})
7875

7976
/**
@@ -86,11 +83,10 @@ export const get = dual<
8683
<A>(key: TestAnnotation.TestAnnotation<A>) => (self: TestAnnotationMap) => A,
8784
<A>(self: TestAnnotationMap, key: TestAnnotation.TestAnnotation<A>) => A
8885
>(2, <A>(self: TestAnnotationMap, key: TestAnnotation.TestAnnotation<A>) => {
89-
const value = self.map.get(key as TestAnnotation.TestAnnotation<unknown>)
90-
if (value === undefined) {
91-
return key.initial as A
86+
if (HashMap.has(self.map, key.identifier)) {
87+
return HashMap.unsafeGet(self.map, key.identifier) as A
9288
}
93-
return value as A
89+
return key.initial
9490
})
9591

9692
/**
@@ -110,13 +106,13 @@ export const combine = dual<
110106
(that: TestAnnotationMap) => (self: TestAnnotationMap) => TestAnnotationMap,
111107
(self: TestAnnotationMap, that: TestAnnotationMap) => TestAnnotationMap
112108
>(2, (self, that) => {
113-
const result = new Map<TestAnnotation.TestAnnotation<unknown>, unknown>(self.map)
109+
let result = self.map
114110
for (const entry of that.map) {
115-
if (result.has(entry[0])) {
116-
const value = result.get(entry[0])!
117-
result.set(entry[0], entry[0].combine(value, entry[1]))
111+
if (HashMap.has(result, entry[0])) {
112+
const value = HashMap.get(result, entry[0])!
113+
result = HashMap.set(result, entry[0], entry[0].combine(value, entry[1]))
118114
} else {
119-
result.set(entry[0], entry[1])
115+
result = HashMap.set(result, entry[0], entry[1])
120116
}
121117
}
122118
return make(result)

‎packages/effect/src/TestAnnotations.ts

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ export type TestAnnotationsTypeId = typeof TestAnnotationsTypeId
4040
export interface TestAnnotations {
4141
readonly [TestAnnotationsTypeId]: TestAnnotationsTypeId
4242

43+
/**
44+
* A ref containing the bacnking map for all annotations
45+
*/
4346
readonly ref: Ref.Ref<TestAnnotationMap.TestAnnotationMap>
4447

4548
/**

0 commit comments

Comments
 (0)
Please sign in to comment.