effect 2.3.6 → 2.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/ModuleVersion/package.json +6 -0
  2. package/dist/cjs/BigDecimal.js +1 -1
  3. package/dist/cjs/BigDecimal.js.map +1 -1
  4. package/dist/cjs/Chunk.js +1 -1
  5. package/dist/cjs/Chunk.js.map +1 -1
  6. package/dist/cjs/Cron.js +1 -1
  7. package/dist/cjs/Cron.js.map +1 -1
  8. package/dist/cjs/Duration.js +1 -1
  9. package/dist/cjs/Duration.js.map +1 -1
  10. package/dist/cjs/FiberMap.js.map +1 -1
  11. package/dist/cjs/GlobalValue.js +27 -2
  12. package/dist/cjs/GlobalValue.js.map +1 -1
  13. package/dist/cjs/Hash.js +29 -1
  14. package/dist/cjs/Hash.js.map +1 -1
  15. package/dist/cjs/List.js +3 -2
  16. package/dist/cjs/List.js.map +1 -1
  17. package/dist/cjs/ModuleVersion.js +49 -0
  18. package/dist/cjs/ModuleVersion.js.map +1 -0
  19. package/dist/cjs/SortedMap.js +1 -1
  20. package/dist/cjs/SortedMap.js.map +1 -1
  21. package/dist/cjs/SortedSet.js +1 -1
  22. package/dist/cjs/SortedSet.js.map +1 -1
  23. package/dist/cjs/TestAnnotation.js +1 -1
  24. package/dist/cjs/TestAnnotation.js.map +1 -1
  25. package/dist/cjs/index.js +4 -2
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/internal/cache.js +2 -2
  28. package/dist/cjs/internal/cache.js.map +1 -1
  29. package/dist/cjs/internal/cause.js +1 -1
  30. package/dist/cjs/internal/cause.js.map +1 -1
  31. package/dist/cjs/internal/context.js +1 -1
  32. package/dist/cjs/internal/context.js.map +1 -1
  33. package/dist/cjs/internal/core.js +4 -4
  34. package/dist/cjs/internal/core.js.map +1 -1
  35. package/dist/cjs/internal/data.js +1 -1
  36. package/dist/cjs/internal/data.js.map +1 -1
  37. package/dist/cjs/internal/effect/circular.js +1 -1
  38. package/dist/cjs/internal/effect/circular.js.map +1 -1
  39. package/dist/cjs/internal/effectable.js +4 -4
  40. package/dist/cjs/internal/effectable.js.map +1 -1
  41. package/dist/cjs/internal/either.js +2 -2
  42. package/dist/cjs/internal/either.js.map +1 -1
  43. package/dist/cjs/internal/fiberId.js +2 -9
  44. package/dist/cjs/internal/fiberId.js.map +1 -1
  45. package/dist/cjs/internal/fiberRuntime.js +3 -3
  46. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  47. package/dist/cjs/internal/fiberStatus.js +4 -3
  48. package/dist/cjs/internal/fiberStatus.js.map +1 -1
  49. package/dist/cjs/internal/hashMap.js +1 -1
  50. package/dist/cjs/internal/hashMap.js.map +1 -1
  51. package/dist/cjs/internal/hashSet.js +1 -1
  52. package/dist/cjs/internal/hashSet.js.map +1 -1
  53. package/dist/cjs/internal/keyedPool.js +2 -2
  54. package/dist/cjs/internal/keyedPool.js.map +1 -1
  55. package/dist/cjs/internal/metric/keyType.js +4 -4
  56. package/dist/cjs/internal/metric/keyType.js.map +1 -1
  57. package/dist/cjs/internal/metric/state.js +5 -9
  58. package/dist/cjs/internal/metric/state.js.map +1 -1
  59. package/dist/cjs/internal/option.js +3 -2
  60. package/dist/cjs/internal/option.js.map +1 -1
  61. package/dist/cjs/internal/pool.js +1 -1
  62. package/dist/cjs/internal/pool.js.map +1 -1
  63. package/dist/cjs/internal/redBlackTree.js +1 -1
  64. package/dist/cjs/internal/redBlackTree.js.map +1 -1
  65. package/dist/cjs/internal/secret.js +1 -1
  66. package/dist/cjs/internal/secret.js.map +1 -1
  67. package/dist/cjs/internal/stm/core.js +1 -1
  68. package/dist/cjs/internal/stm/core.js.map +1 -1
  69. package/dist/cjs/internal/stm/stm/stmState.js +6 -4
  70. package/dist/cjs/internal/stm/stm/stmState.js.map +1 -1
  71. package/dist/cjs/internal/stm/stm/tExit.js +7 -6
  72. package/dist/cjs/internal/stm/stm/tExit.js.map +1 -1
  73. package/dist/cjs/internal/trie.js +1 -1
  74. package/dist/cjs/internal/trie.js.map +1 -1
  75. package/dist/cjs/internal/version.js +8 -2
  76. package/dist/cjs/internal/version.js.map +1 -1
  77. package/dist/dts/BigDecimal.d.ts.map +1 -1
  78. package/dist/dts/Cron.d.ts.map +1 -1
  79. package/dist/dts/FiberMap.d.ts +4 -5
  80. package/dist/dts/FiberMap.d.ts.map +1 -1
  81. package/dist/dts/Hash.d.ts +8 -0
  82. package/dist/dts/Hash.d.ts.map +1 -1
  83. package/dist/dts/List.d.ts.map +1 -1
  84. package/dist/dts/ModuleVersion.d.ts +11 -0
  85. package/dist/dts/ModuleVersion.d.ts.map +1 -0
  86. package/dist/dts/SortedMap.d.ts.map +1 -1
  87. package/dist/dts/SortedSet.d.ts.map +1 -1
  88. package/dist/dts/TestAnnotation.d.ts.map +1 -1
  89. package/dist/dts/index.d.ts +6 -0
  90. package/dist/dts/index.d.ts.map +1 -1
  91. package/dist/dts/internal/metric/keyType.d.ts.map +1 -1
  92. package/dist/dts/internal/metric/state.d.ts.map +1 -1
  93. package/dist/dts/internal/version.d.ts +2 -1
  94. package/dist/dts/internal/version.d.ts.map +1 -1
  95. package/dist/esm/BigDecimal.js +1 -1
  96. package/dist/esm/BigDecimal.js.map +1 -1
  97. package/dist/esm/Chunk.js +1 -1
  98. package/dist/esm/Chunk.js.map +1 -1
  99. package/dist/esm/Cron.js +1 -1
  100. package/dist/esm/Cron.js.map +1 -1
  101. package/dist/esm/Duration.js +1 -1
  102. package/dist/esm/Duration.js.map +1 -1
  103. package/dist/esm/FiberMap.js.map +1 -1
  104. package/dist/esm/GlobalValue.js +2 -2
  105. package/dist/esm/GlobalValue.js.map +1 -1
  106. package/dist/esm/Hash.js +27 -0
  107. package/dist/esm/Hash.js.map +1 -1
  108. package/dist/esm/List.js +3 -2
  109. package/dist/esm/List.js.map +1 -1
  110. package/dist/esm/ModuleVersion.js +17 -0
  111. package/dist/esm/ModuleVersion.js.map +1 -0
  112. package/dist/esm/SortedMap.js +1 -1
  113. package/dist/esm/SortedMap.js.map +1 -1
  114. package/dist/esm/SortedSet.js +1 -1
  115. package/dist/esm/SortedSet.js.map +1 -1
  116. package/dist/esm/TestAnnotation.js +1 -1
  117. package/dist/esm/TestAnnotation.js.map +1 -1
  118. package/dist/esm/index.js +6 -0
  119. package/dist/esm/index.js.map +1 -1
  120. package/dist/esm/internal/cache.js +2 -2
  121. package/dist/esm/internal/cache.js.map +1 -1
  122. package/dist/esm/internal/cause.js +1 -1
  123. package/dist/esm/internal/cause.js.map +1 -1
  124. package/dist/esm/internal/context.js +1 -1
  125. package/dist/esm/internal/context.js.map +1 -1
  126. package/dist/esm/internal/core.js +4 -4
  127. package/dist/esm/internal/core.js.map +1 -1
  128. package/dist/esm/internal/data.js +1 -1
  129. package/dist/esm/internal/data.js.map +1 -1
  130. package/dist/esm/internal/effect/circular.js +1 -1
  131. package/dist/esm/internal/effect/circular.js.map +1 -1
  132. package/dist/esm/internal/effectable.js +4 -4
  133. package/dist/esm/internal/effectable.js.map +1 -1
  134. package/dist/esm/internal/either.js +2 -2
  135. package/dist/esm/internal/either.js.map +1 -1
  136. package/dist/esm/internal/fiberId.js +2 -9
  137. package/dist/esm/internal/fiberId.js.map +1 -1
  138. package/dist/esm/internal/fiberRuntime.js +3 -3
  139. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  140. package/dist/esm/internal/fiberStatus.js +4 -3
  141. package/dist/esm/internal/fiberStatus.js.map +1 -1
  142. package/dist/esm/internal/hashMap.js +1 -1
  143. package/dist/esm/internal/hashMap.js.map +1 -1
  144. package/dist/esm/internal/hashSet.js +1 -1
  145. package/dist/esm/internal/hashSet.js.map +1 -1
  146. package/dist/esm/internal/keyedPool.js +2 -2
  147. package/dist/esm/internal/keyedPool.js.map +1 -1
  148. package/dist/esm/internal/metric/keyType.js +4 -4
  149. package/dist/esm/internal/metric/keyType.js.map +1 -1
  150. package/dist/esm/internal/metric/state.js +5 -9
  151. package/dist/esm/internal/metric/state.js.map +1 -1
  152. package/dist/esm/internal/option.js +3 -2
  153. package/dist/esm/internal/option.js.map +1 -1
  154. package/dist/esm/internal/pool.js +1 -1
  155. package/dist/esm/internal/pool.js.map +1 -1
  156. package/dist/esm/internal/redBlackTree.js +1 -1
  157. package/dist/esm/internal/redBlackTree.js.map +1 -1
  158. package/dist/esm/internal/secret.js +1 -1
  159. package/dist/esm/internal/secret.js.map +1 -1
  160. package/dist/esm/internal/stm/core.js +1 -1
  161. package/dist/esm/internal/stm/core.js.map +1 -1
  162. package/dist/esm/internal/stm/stm/stmState.js +5 -3
  163. package/dist/esm/internal/stm/stm/stmState.js.map +1 -1
  164. package/dist/esm/internal/stm/stm/tExit.js +6 -5
  165. package/dist/esm/internal/stm/stm/tExit.js.map +1 -1
  166. package/dist/esm/internal/trie.js +1 -1
  167. package/dist/esm/internal/trie.js.map +1 -1
  168. package/dist/esm/internal/version.js +5 -1
  169. package/dist/esm/internal/version.js.map +1 -1
  170. package/package.json +11 -2
  171. package/src/BigDecimal.ts +2 -1
  172. package/src/Chunk.ts +1 -1
  173. package/src/Cron.ts +2 -1
  174. package/src/Duration.ts +2 -2
  175. package/src/FiberMap.ts +0 -1
  176. package/src/GlobalValue.ts +2 -2
  177. package/src/Hash.ts +31 -0
  178. package/src/List.ts +3 -2
  179. package/src/ModuleVersion.ts +18 -0
  180. package/src/SortedMap.ts +5 -1
  181. package/src/SortedSet.ts +5 -1
  182. package/src/TestAnnotation.ts +2 -1
  183. package/src/index.ts +7 -0
  184. package/src/internal/cache.ts +3 -2
  185. package/src/internal/cause.ts +2 -1
  186. package/src/internal/context.ts +1 -1
  187. package/src/internal/core.ts +4 -4
  188. package/src/internal/data.ts +1 -1
  189. package/src/internal/effect/circular.ts +1 -1
  190. package/src/internal/effectable.ts +5 -5
  191. package/src/internal/either.ts +2 -2
  192. package/src/internal/fiberId.ts +7 -13
  193. package/src/internal/fiberRuntime.ts +3 -3
  194. package/src/internal/fiberStatus.ts +7 -6
  195. package/src/internal/hashMap.ts +2 -2
  196. package/src/internal/hashSet.ts +4 -1
  197. package/src/internal/keyedPool.ts +4 -2
  198. package/src/internal/metric/keyType.ts +7 -5
  199. package/src/internal/metric/state.ts +11 -10
  200. package/src/internal/option.ts +3 -2
  201. package/src/internal/pool.ts +2 -1
  202. package/src/internal/redBlackTree.ts +2 -2
  203. package/src/internal/secret.ts +2 -1
  204. package/src/internal/stm/core.ts +1 -1
  205. package/src/internal/stm/stm/stmState.ts +16 -11
  206. package/src/internal/stm/stm/tExit.ts +15 -9
  207. package/src/internal/trie.ts +2 -2
  208. package/src/internal/version.ts +7 -1
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "effect",
3
- "version": "2.3.6",
3
+ "version": "2.3.8",
4
4
  "description": "Functional programming in TypeScript",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/effect-ts/effect.git"
8
+ "url": "https://github.com/effect-ts/effect.git",
9
+ "directory": "packages/effect"
9
10
  },
10
11
  "sideEffects": [],
11
12
  "main": "./dist/cjs/index.js",
@@ -348,6 +349,11 @@
348
349
  "import": "./dist/esm/MetricState.js",
349
350
  "default": "./dist/cjs/MetricState.js"
350
351
  },
352
+ "./ModuleVersion": {
353
+ "types": "./dist/dts/ModuleVersion.d.ts",
354
+ "import": "./dist/esm/ModuleVersion.js",
355
+ "default": "./dist/cjs/ModuleVersion.js"
356
+ },
351
357
  "./MutableHashMap": {
352
358
  "types": "./dist/dts/MutableHashMap.d.ts",
353
359
  "import": "./dist/esm/MutableHashMap.js",
@@ -964,6 +970,9 @@
964
970
  "MetricState": [
965
971
  "./dist/dts/MetricState.d.ts"
966
972
  ],
973
+ "ModuleVersion": [
974
+ "./dist/dts/ModuleVersion.d.ts"
975
+ ],
967
976
  "MutableHashMap": [
968
977
  "./dist/dts/MutableHashMap.d.ts"
969
978
  ],
package/src/BigDecimal.ts CHANGED
@@ -57,7 +57,8 @@ const BigDecimalProto: Omit<BigDecimal, "value" | "scale" | "normalized"> = {
57
57
  const normalized = normalize(this)
58
58
  return pipe(
59
59
  Hash.hash(normalized.value),
60
- Hash.combine(Hash.number(normalized.scale))
60
+ Hash.combine(Hash.number(normalized.scale)),
61
+ Hash.cached(this)
61
62
  )
62
63
  },
63
64
  [Equal.symbol](this: BigDecimal, that: unknown): boolean {
package/src/Chunk.ts CHANGED
@@ -142,7 +142,7 @@ const ChunkProto: Omit<Chunk<unknown>, "backing" | "depth" | "left" | "length" |
142
142
  return isChunk(that) && _equivalence(this, that)
143
143
  },
144
144
  [Hash.symbol]<A>(this: Chunk<A>): number {
145
- return Hash.array(toReadonlyArray(this))
145
+ return Hash.cached(this, Hash.array(toReadonlyArray(this)))
146
146
  },
147
147
  [Symbol.iterator]<A>(this: Chunk<A>): Iterator<A> {
148
148
  switch (this.backing._tag) {
package/src/Cron.ts CHANGED
@@ -50,7 +50,8 @@ const CronProto: Omit<Cron, "minutes" | "hours" | "days" | "months" | "weekdays"
50
50
  Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.hours))),
51
51
  Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.days))),
52
52
  Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.months))),
53
- Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.weekdays)))
53
+ Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.weekdays))),
54
+ Hash.cached(this)
54
55
  )
55
56
  },
56
57
  toString(this: Cron) {
package/src/Duration.ts CHANGED
@@ -116,8 +116,8 @@ const infinityValue: DurationValue = { _tag: "Infinity" }
116
116
 
117
117
  const DurationProto: Omit<Duration, "value"> = {
118
118
  [TypeId]: TypeId,
119
- [Hash.symbol](this: Duration): number {
120
- return Hash.structure(this.value)
119
+ [Hash.symbol](this: Duration) {
120
+ return Hash.cached(this, Hash.structure(this.value))
121
121
  },
122
122
  [Equal.symbol](this: Duration, that: unknown): boolean {
123
123
  return isDuration(that) && equals(this, that)
package/src/FiberMap.ts CHANGED
@@ -7,7 +7,6 @@ import type { NoSuchElementException } from "./Cause.js"
7
7
  import * as Fiber from "./Fiber.js"
8
8
  import * as FiberId from "./FiberId.js"
9
9
  import { dual } from "./Function.js"
10
- import type { FiberMap } from "./index.js"
11
10
  import * as Inspectable from "./Inspectable.js"
12
11
  import * as MutableHashMap from "./MutableHashMap.js"
13
12
  import * as Option from "./Option.js"
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * @since 2.0.0
3
3
  */
4
- import { moduleVersion } from "./internal/version.js"
4
+ import * as version from "./internal/version.js"
5
5
 
6
- const globalStoreId = Symbol.for(`effect/GlobalValue/globalStoreId/${moduleVersion}`)
6
+ const globalStoreId = Symbol.for(`effect/GlobalValue/globalStoreId/${version.getCurrentVersion()}`)
7
7
 
8
8
  if (!(globalStoreId in globalThis)) {
9
9
  ;(globalThis as any)[globalStoreId] = new Map()
package/src/Hash.ts CHANGED
@@ -156,3 +156,34 @@ export const array = <A>(arr: ReadonlyArray<A>) => {
156
156
  }
157
157
  return optimize(h)
158
158
  }
159
+
160
+ /**
161
+ * @since 2.0.0
162
+ * @category hashing
163
+ */
164
+ export const cached: {
165
+ (self: object): (hash: number) => number
166
+ (self: object, hash: number): number
167
+ } = function() {
168
+ if (arguments.length === 1) {
169
+ const self = arguments[0] as object
170
+ return function(hash: number) {
171
+ Object.defineProperty(self, symbol, {
172
+ value() {
173
+ return hash
174
+ },
175
+ enumerable: false
176
+ })
177
+ return hash
178
+ } as any
179
+ }
180
+ const self = arguments[0] as object
181
+ const hash = arguments[1] as number
182
+ Object.defineProperty(self, symbol, {
183
+ value() {
184
+ return hash
185
+ },
186
+ enumerable: false
187
+ })
188
+ return hash
189
+ }
package/src/List.ts CHANGED
@@ -118,7 +118,7 @@ const ConsProto: Omit<Cons<unknown>, "head" | "tail"> = {
118
118
  _equivalence(this, that)
119
119
  },
120
120
  [Hash.symbol](this: Cons<unknown>): number {
121
- return Hash.array(toArray(this))
121
+ return Hash.cached(this, Hash.array(toArray(this)))
122
122
  },
123
123
  [Symbol.iterator](this: Cons<unknown>): Iterator<unknown> {
124
124
  let done = false
@@ -162,6 +162,7 @@ const makeCons = <A>(head: A, tail: List<A>): MutableCons<A> => {
162
162
  return cons
163
163
  }
164
164
 
165
+ const NilHash = Hash.string("Nil")
165
166
  const NilProto: Nil<unknown> = {
166
167
  [TypeId]: TypeId,
167
168
  _tag: "Nil",
@@ -178,7 +179,7 @@ const NilProto: Nil<unknown> = {
178
179
  return this.toJSON()
179
180
  },
180
181
  [Hash.symbol](): number {
181
- return Hash.array(toArray(this))
182
+ return NilHash
182
183
  },
183
184
  [Equal.symbol](that: unknown): boolean {
184
185
  return isList(that) && this._tag === that._tag
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @since 2.0.0
3
+ *
4
+ * Enables low level framework authors to run on their own isolated effect version
5
+ */
6
+ import * as internal from "./internal/version.js"
7
+
8
+ /**
9
+ * @since 2.0.0
10
+ * @category version
11
+ */
12
+ export const getCurrentVersion: () => string = internal.getCurrentVersion
13
+
14
+ /**
15
+ * @since 2.0.0
16
+ * @category version
17
+ */
18
+ export const setCurrentVersion: (version: string) => void = internal.setCurrentVersion
package/src/SortedMap.ts CHANGED
@@ -41,7 +41,11 @@ const SortedMapProto: Omit<SortedMap<unknown, unknown>, "tree"> = {
41
41
  _V: (_: never) => _
42
42
  },
43
43
  [Hash.symbol]<K, V>(this: SortedMap<K, V>): number {
44
- return pipe(Hash.hash(this.tree), Hash.combine(Hash.hash("effect/SortedMap")))
44
+ return pipe(
45
+ Hash.hash(this.tree),
46
+ Hash.combine(Hash.hash("effect/SortedMap")),
47
+ Hash.cached(this)
48
+ )
45
49
  },
46
50
  [Equal.symbol]<K, V>(this: SortedMap<K, V>, that: unknown): boolean {
47
51
  return isSortedMap(that) && Equal.equals(this.tree, that.tree)
package/src/SortedSet.ts CHANGED
@@ -40,7 +40,11 @@ const SortedSetProto: Omit<SortedSet<unknown>, "keyTree"> = {
40
40
  _A: (_: any) => _
41
41
  },
42
42
  [Hash.symbol]<A>(this: SortedSet<A>): number {
43
- return pipe(Hash.hash(this.keyTree), Hash.combine(Hash.hash(TypeId)))
43
+ return pipe(
44
+ Hash.hash(this.keyTree),
45
+ Hash.combine(Hash.hash(TypeId)),
46
+ Hash.cached(this)
47
+ )
44
48
  },
45
49
  [Equal.symbol]<A>(this: SortedSet<A>, that: unknown): boolean {
46
50
  return isSortedSet(that) && Equal.equals(this.keyTree, that.keyTree)
@@ -51,7 +51,8 @@ class TestAnnotationImpl<A> implements Equal.Equal {
51
51
  [Hash.symbol](): number {
52
52
  return pipe(
53
53
  Hash.hash(TestAnnotationSymbolKey),
54
- Hash.combine(Hash.hash(this.identifier))
54
+ Hash.combine(Hash.hash(this.identifier)),
55
+ Hash.cached(this)
55
56
  )
56
57
  }
57
58
  [Equal.symbol](that: unknown): boolean {
package/src/index.ts CHANGED
@@ -455,6 +455,13 @@ export * as MetricRegistry from "./MetricRegistry.js"
455
455
  */
456
456
  export * as MetricState from "./MetricState.js"
457
457
 
458
+ /**
459
+ * @since 2.0.0
460
+ *
461
+ * Enables low level framework authors to run on their own isolated effect version
462
+ */
463
+ export * as ModuleVersion from "./ModuleVersion.js"
464
+
458
465
  /**
459
466
  * @since 2.0.0
460
467
  */
@@ -123,7 +123,8 @@ class MapKeyImpl<out K> implements MapKey<K> {
123
123
  return pipe(
124
124
  Hash.hash(this.current),
125
125
  Hash.combine(Hash.hash(this.previous)),
126
- Hash.combine(Hash.hash(this.next))
126
+ Hash.combine(Hash.hash(this.next)),
127
+ Hash.cached(this)
127
128
  )
128
129
  }
129
130
  [Equal.symbol](that: unknown): boolean {
@@ -551,11 +552,11 @@ class CacheImpl<in out Key, in out Error, in out Value> implements Cache.Cache<K
551
552
  switch (value._tag) {
552
553
  case "Complete": {
553
554
  this.trackAccess(value.key)
554
- this.trackHit()
555
555
  if (this.hasExpired(clock, value.timeToLiveMillis)) {
556
556
  MutableHashMap.remove(this.cacheState.map, value.key.current)
557
557
  return core.succeed(Option.none<Value>())
558
558
  }
559
+ this.trackHit()
559
560
  return core.map(value.exit, Option.some)
560
561
  }
561
562
  case "Pending": {
@@ -39,7 +39,8 @@ const proto = {
39
39
  [Hash.symbol](this: Cause.Cause<any>): number {
40
40
  return pipe(
41
41
  Hash.hash(CauseSymbolKey),
42
- Hash.combine(Hash.hash(flattenCause(this)))
42
+ Hash.combine(Hash.hash(flattenCause(this))),
43
+ Hash.cached(this)
43
44
  )
44
45
  },
45
46
  [Equal.symbol](this: Cause.Cause<any>, that: unknown): boolean {
@@ -111,7 +111,7 @@ export const ContextProto: Omit<C.Context<unknown>, "unsafeMap"> = {
111
111
  return false
112
112
  },
113
113
  [Hash.symbol]<A>(this: C.Context<A>): number {
114
- return Hash.number(this.unsafeMap.size)
114
+ return Hash.cached(this, Hash.number(this.unsafeMap.size))
115
115
  },
116
116
  pipe<A>(this: C.Context<A>) {
117
117
  return pipeArguments(this, arguments)
@@ -158,7 +158,7 @@ class EffectPrimitive {
158
158
  return this === that
159
159
  }
160
160
  [Hash.symbol](this: {}) {
161
- return Hash.random(this)
161
+ return Hash.cached(this, Hash.random(this))
162
162
  }
163
163
  pipe() {
164
164
  return pipeArguments(this, arguments)
@@ -195,7 +195,7 @@ class EffectPrimitiveFailure {
195
195
  return this === that
196
196
  }
197
197
  [Hash.symbol](this: {}) {
198
- return Hash.random(this)
198
+ return Hash.cached(this, Hash.random(this))
199
199
  }
200
200
  get cause() {
201
201
  return this.i0
@@ -233,7 +233,7 @@ class EffectPrimitiveSuccess {
233
233
  return this === that
234
234
  }
235
235
  [Hash.symbol](this: {}) {
236
- return Hash.random(this)
236
+ return Hash.cached(this, Hash.random(this))
237
237
  }
238
238
  get value() {
239
239
  return this.i0
@@ -1734,7 +1734,7 @@ export class RequestResolverImpl<out R, in A> implements RequestResolver.Request
1734
1734
  this.runAll = runAll as any
1735
1735
  }
1736
1736
  [Hash.symbol](): number {
1737
- return this.target ? Hash.hash(this.target) : Hash.random(this)
1737
+ return Hash.cached(this, this.target ? Hash.hash(this.target) : Hash.random(this))
1738
1738
  }
1739
1739
  [Equal.symbol](that: unknown): boolean {
1740
1740
  return this.target ?
@@ -6,7 +6,7 @@ import { StructuralPrototype } from "./effectable.js"
6
6
  /** @internal */
7
7
  export const ArrayProto: Equal.Equal = Object.assign(Object.create(Array.prototype), {
8
8
  [Hash.symbol](this: Array<any>) {
9
- return Hash.array(this)
9
+ return Hash.cached(this, Hash.array(this))
10
10
  },
11
11
  [Equal.symbol](this: Array<any>, that: Equal.Equal) {
12
12
  if (Array.isArray(that) && this.length === that.length) {
@@ -315,7 +315,7 @@ class Key<in out A> implements Equal.Equal {
315
315
  return false
316
316
  }
317
317
  [Hash.symbol]() {
318
- return this.eq ? 0 : Hash.hash(this.a)
318
+ return this.eq ? 0 : Hash.cached(this, Hash.hash(this.a))
319
319
  }
320
320
  }
321
321
 
@@ -7,7 +7,7 @@ import { pipeArguments } from "../Pipeable.js"
7
7
  import type * as Sink from "../Sink.js"
8
8
  import type * as Stream from "../Stream.js"
9
9
  import * as OpCodes from "./opCodes/effect.js"
10
- import { moduleVersion } from "./version.js"
10
+ import * as version from "./version.js"
11
11
 
12
12
  /** @internal */
13
13
  export const EffectTypeId: Effect.EffectTypeId = Symbol.for("effect/Effect") as Effect.EffectTypeId
@@ -30,7 +30,7 @@ export const effectVariance = {
30
30
  /* c8 ignore next */
31
31
  _A: (_: never) => _,
32
32
 
33
- _V: moduleVersion
33
+ _V: version.getCurrentVersion()
34
34
  }
35
35
 
36
36
  const sinkVariance = {
@@ -73,7 +73,7 @@ export const EffectPrototype: Effect.Effect<never> & Equal.Equal = {
73
73
  return this === that
74
74
  },
75
75
  [Hash.symbol]() {
76
- return Hash.random(this)
76
+ return Hash.cached(this, Hash.random(this))
77
77
  },
78
78
  pipe() {
79
79
  return pipeArguments(this, arguments)
@@ -82,8 +82,8 @@ export const EffectPrototype: Effect.Effect<never> & Equal.Equal = {
82
82
 
83
83
  /** @internal */
84
84
  export const StructuralPrototype: Equal.Equal = {
85
- [Hash.symbol](this: Equal.Equal) {
86
- return Hash.structure(this)
85
+ [Hash.symbol]() {
86
+ return Hash.cached(this, Hash.structure(this))
87
87
  },
88
88
  [Equal.symbol](this: Equal.Equal, that: Equal.Equal) {
89
89
  const selfKeys = Object.keys(this)
@@ -37,7 +37,7 @@ const RightProto = Object.assign(Object.create(CommonProto), {
37
37
  return isEither(that) && isRight(that) && Equal.equals(that.right, this.right)
38
38
  },
39
39
  [Hash.symbol]<E, A>(this: Either.Right<E, A>) {
40
- return Hash.combine(Hash.hash(this._tag))(Hash.hash(this.right))
40
+ return Hash.cached(this, Hash.combine(Hash.hash(this._tag))(Hash.hash(this.right)))
41
41
  },
42
42
  toJSON<E, A>(this: Either.Right<E, A>) {
43
43
  return {
@@ -55,7 +55,7 @@ const LeftProto = Object.assign(Object.create(CommonProto), {
55
55
  return isEither(that) && isLeft(that) && Equal.equals(that.left, this.left)
56
56
  },
57
57
  [Hash.symbol]<E, A>(this: Either.Left<E, A>) {
58
- return Hash.combine(Hash.hash(this._tag))(Hash.hash(this.left))
58
+ return Hash.cached(this, Hash.combine(Hash.hash(this._tag))(Hash.hash(this.left)))
59
59
  },
60
60
  toJSON<E, A>(this: Either.Left<E, A>) {
61
61
  return {
@@ -71,12 +71,8 @@ class Runtime implements FiberId.Runtime {
71
71
  readonly id: number,
72
72
  readonly startTimeMillis: number
73
73
  ) {}
74
- _hash: number | undefined;
75
74
  [Hash.symbol](): number {
76
- if (this._hash == undefined) {
77
- this._hash = Hash.string(`${FiberIdSymbolKey}-${this._tag}-${this.id}-${this.startTimeMillis}`)
78
- }
79
- return this._hash
75
+ return Hash.cached(this, Hash.string(`${FiberIdSymbolKey}-${this._tag}-${this.id}-${this.startTimeMillis}`))
80
76
  }
81
77
  [Equal.symbol](that: unknown): boolean {
82
78
  return isFiberId(that) &&
@@ -111,14 +107,12 @@ class Composite implements FiberId.Composite {
111
107
  }
112
108
  _hash: number | undefined;
113
109
  [Hash.symbol](): number {
114
- if (this._hash == undefined) {
115
- this._hash = pipe(
116
- Hash.string(`${FiberIdSymbolKey}-${this._tag}`),
117
- Hash.combine(Hash.hash(this.left)),
118
- Hash.combine(Hash.hash(this.right))
119
- )
120
- }
121
- return this._hash
110
+ return pipe(
111
+ Hash.string(`${FiberIdSymbolKey}-${this._tag}`),
112
+ Hash.combine(Hash.hash(this.left)),
113
+ Hash.combine(Hash.hash(this.right)),
114
+ Hash.cached(this)
115
+ )
122
116
  }
123
117
  [Equal.symbol](that: unknown): boolean {
124
118
  return isFiberId(that) &&
@@ -67,7 +67,7 @@ import { OpSupervision } from "./runtimeFlags.js"
67
67
  import * as supervisor from "./supervisor.js"
68
68
  import * as SupervisorPatch from "./supervisor/patch.js"
69
69
  import * as tracer from "./tracer.js"
70
- import { moduleVersion } from "./version.js"
70
+ import * as version from "./version.js"
71
71
 
72
72
  /** @internal */
73
73
  export const fiberStarted = metric.counter("effect_fiber_started")
@@ -1287,11 +1287,11 @@ export class FiberRuntime<in out A, in out E = never> implements Fiber.RuntimeFi
1287
1287
  // @ts-expect-error
1288
1288
  cur = this._tracer.context(
1289
1289
  () => {
1290
- if (moduleVersion !== (cur as core.Primitive)[EffectTypeId]._V) {
1290
+ if (version.getCurrentVersion() !== (cur as core.Primitive)[EffectTypeId]._V) {
1291
1291
  return core.dieMessage(
1292
1292
  `Cannot execute an Effect versioned ${
1293
1293
  (cur as core.Primitive)[EffectTypeId]._V
1294
- } with a Runtime of version ${moduleVersion}`
1294
+ } with a Runtime of version ${version.getCurrentVersion()}`
1295
1295
  )
1296
1296
  }
1297
1297
  // @ts-expect-error
@@ -31,15 +31,14 @@ export const OP_SUSPENDED = "Suspended" as const
31
31
  /** @internal */
32
32
  export type OP_SUSPENDED = typeof OP_SUSPENDED
33
33
 
34
+ const DoneHash = Hash.string(`${FiberStatusSymbolKey}-${OP_DONE}`)
35
+
34
36
  /** @internal */
35
37
  class Done implements FiberStatus.Done {
36
38
  readonly [FiberStatusTypeId]: FiberStatus.FiberStatusTypeId = FiberStatusTypeId
37
39
  readonly _tag = OP_DONE;
38
40
  [Hash.symbol](): number {
39
- return pipe(
40
- Hash.hash(FiberStatusSymbolKey),
41
- Hash.combine(Hash.hash(this._tag))
42
- )
41
+ return DoneHash
43
42
  }
44
43
  [Equal.symbol](that: unknown): boolean {
45
44
  return isFiberStatus(that) && that._tag === OP_DONE
@@ -55,7 +54,8 @@ class Running implements FiberStatus.Running {
55
54
  return pipe(
56
55
  Hash.hash(FiberStatusSymbolKey),
57
56
  Hash.combine(Hash.hash(this._tag)),
58
- Hash.combine(Hash.hash(this.runtimeFlags))
57
+ Hash.combine(Hash.hash(this.runtimeFlags)),
58
+ Hash.cached(this)
59
59
  )
60
60
  }
61
61
  [Equal.symbol](that: unknown): boolean {
@@ -80,7 +80,8 @@ class Suspended implements FiberStatus.Suspended {
80
80
  Hash.hash(FiberStatusSymbolKey),
81
81
  Hash.combine(Hash.hash(this._tag)),
82
82
  Hash.combine(Hash.hash(this.runtimeFlags)),
83
- Hash.combine(Hash.hash(this.blockingOn))
83
+ Hash.combine(Hash.hash(this.blockingOn)),
84
+ Hash.cached(this)
84
85
  )
85
86
  }
86
87
  [Equal.symbol](that: unknown): boolean {
@@ -47,12 +47,12 @@ const HashMapProto: HM.HashMap<unknown, unknown> = {
47
47
  [Symbol.iterator]<K, V>(this: HashMapImpl<K, V>): Iterator<[K, V]> {
48
48
  return new HashMapIterator(this, (k, v) => [k, v])
49
49
  },
50
- [Hash.symbol](): number {
50
+ [Hash.symbol](this: HM.HashMap<unknown, unknown>): number {
51
51
  let hash = Hash.hash(HashMapSymbolKey)
52
52
  for (const item of this) {
53
53
  hash ^= pipe(Hash.hash(item[0]), Hash.combine(Hash.hash(item[1])))
54
54
  }
55
- return hash
55
+ return Hash.cached(this, hash)
56
56
  },
57
57
  [Equal.symbol]<K, V>(this: HashMapImpl<K, V>, that: unknown): boolean {
58
58
  if (isHashMap(that)) {
@@ -26,7 +26,10 @@ const HashSetProto: Omit<HashSetImpl<unknown>, "_keyMap"> = {
26
26
  return HM.keys(this._keyMap)
27
27
  },
28
28
  [Hash.symbol]<A>(this: HashSetImpl<A>): number {
29
- return Hash.combine(Hash.hash(this._keyMap))(Hash.hash(HashSetSymbolKey))
29
+ return Hash.cached(
30
+ this,
31
+ Hash.combine(Hash.hash(this._keyMap))(Hash.hash(HashSetSymbolKey))
32
+ )
30
33
  },
31
34
  [Equal.symbol]<A>(this: HashSetImpl<A>, that: unknown): boolean {
32
35
  if (isHashSet(that)) {
@@ -62,7 +62,8 @@ class Complete<in out A, out E> implements Equal.Equal {
62
62
  [Hash.symbol](): number {
63
63
  return pipe(
64
64
  Hash.string("effect/KeyedPool/Complete"),
65
- Hash.combine(Hash.hash(this.pool))
65
+ Hash.combine(Hash.hash(this.pool)),
66
+ Hash.cached(this)
66
67
  )
67
68
  }
68
69
  [Equal.symbol](u: unknown): boolean {
@@ -80,7 +81,8 @@ class Pending<in out A, in out E> implements Equal.Equal {
80
81
  [Hash.symbol](): number {
81
82
  return pipe(
82
83
  Hash.string("effect/KeyedPool/Pending"),
83
- Hash.combine(Hash.hash(this.deferred))
84
+ Hash.combine(Hash.hash(this.deferred)),
85
+ Hash.cached(this)
84
86
  )
85
87
  }
86
88
  [Equal.symbol](u: unknown): boolean {
@@ -81,13 +81,14 @@ class CounterKeyType<A extends (number | bigint)> implements MetricKeyType.Metri
81
81
  }
82
82
  }
83
83
 
84
+ const FrequencyKeyTypeHash = Hash.string(FrequencyKeyTypeSymbolKey)
85
+
84
86
  /** @internal */
85
87
  class FrequencyKeyType implements MetricKeyType.MetricKeyType.Frequency {
86
88
  readonly [MetricKeyTypeTypeId] = metricKeyTypeVariance
87
- readonly [FrequencyKeyTypeTypeId]: MetricKeyType.FrequencyKeyTypeTypeId = FrequencyKeyTypeTypeId
88
- readonly _hash = Hash.string(FrequencyKeyTypeSymbolKey);
89
+ readonly [FrequencyKeyTypeTypeId]: MetricKeyType.FrequencyKeyTypeTypeId = FrequencyKeyTypeTypeId;
89
90
  [Hash.symbol](): number {
90
- return this._hash
91
+ return FrequencyKeyTypeHash
91
92
  }
92
93
  [Equal.symbol](that: unknown): boolean {
93
94
  return isFrequencyKey(that)
@@ -97,14 +98,15 @@ class FrequencyKeyType implements MetricKeyType.MetricKeyType.Frequency {
97
98
  }
98
99
  }
99
100
 
101
+ const GaugeKeyTypeHash = Hash.string(GaugeKeyTypeSymbolKey)
102
+
100
103
  /** @internal */
101
104
  class GaugeKeyType<A extends (number | bigint)> implements MetricKeyType.MetricKeyType.Gauge<A> {
102
105
  readonly [MetricKeyTypeTypeId] = metricKeyTypeVariance
103
106
  readonly [GaugeKeyTypeTypeId]: MetricKeyType.GaugeKeyTypeTypeId = GaugeKeyTypeTypeId
104
107
  constructor(readonly bigint: boolean) {}
105
- readonly _hash = Hash.string(GaugeKeyTypeSymbolKey);
106
108
  [Hash.symbol](): number {
107
- return this._hash
109
+ return GaugeKeyTypeHash
108
110
  }
109
111
  [Equal.symbol](that: unknown): boolean {
110
112
  return isGaugeKey(that)
@@ -68,7 +68,8 @@ class CounterState<A extends (number | bigint)> implements MetricState.MetricSta
68
68
  [Hash.symbol](): number {
69
69
  return pipe(
70
70
  Hash.hash(CounterStateSymbolKey),
71
- Hash.combine(Hash.hash(this.count))
71
+ Hash.combine(Hash.hash(this.count)),
72
+ Hash.cached(this)
72
73
  )
73
74
  }
74
75
  [Equal.symbol](that: unknown): boolean {
@@ -88,14 +89,11 @@ class FrequencyState implements MetricState.MetricState.Frequency {
88
89
  constructor(readonly occurrences: ReadonlyMap<string, number>) {}
89
90
  _hash: number | undefined;
90
91
  [Hash.symbol](): number {
91
- if (this._hash !== undefined) {
92
- return this._hash
93
- }
94
- this._hash = pipe(
92
+ return pipe(
95
93
  Hash.string(FrequencyStateSymbolKey),
96
- Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.occurrences.entries())))
94
+ Hash.combine(Hash.array(ReadonlyArray.fromIterable(this.occurrences.entries()))),
95
+ Hash.cached(this)
97
96
  )
98
- return this._hash
99
97
  }
100
98
  [Equal.symbol](that: unknown): boolean {
101
99
  return isFrequencyState(that) && arrayEquals(
@@ -116,7 +114,8 @@ class GaugeState<A extends (number | bigint)> implements MetricState.MetricState
116
114
  [Hash.symbol](): number {
117
115
  return pipe(
118
116
  Hash.hash(GaugeStateSymbolKey),
119
- Hash.combine(Hash.hash(this.value))
117
+ Hash.combine(Hash.hash(this.value)),
118
+ Hash.cached(this)
120
119
  )
121
120
  }
122
121
  [Equal.symbol](u: unknown): boolean {
@@ -145,7 +144,8 @@ export class HistogramState implements MetricState.MetricState.Histogram {
145
144
  Hash.combine(Hash.hash(this.count)),
146
145
  Hash.combine(Hash.hash(this.min)),
147
146
  Hash.combine(Hash.hash(this.max)),
148
- Hash.combine(Hash.hash(this.sum))
147
+ Hash.combine(Hash.hash(this.sum)),
148
+ Hash.cached(this)
149
149
  )
150
150
  }
151
151
  [Equal.symbol](that: unknown): boolean {
@@ -181,7 +181,8 @@ export class SummaryState implements MetricState.MetricState.Summary {
181
181
  Hash.combine(Hash.hash(this.count)),
182
182
  Hash.combine(Hash.hash(this.min)),
183
183
  Hash.combine(Hash.hash(this.max)),
184
- Hash.combine(Hash.hash(this.sum))
184
+ Hash.combine(Hash.hash(this.sum)),
185
+ Hash.cached(this)
185
186
  )
186
187
  }
187
188
  [Equal.symbol](that: unknown): boolean {