effect 4.0.0-beta.0 → 4.0.0-beta.10

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 (571) hide show
  1. package/dist/Cache.d.ts +2 -2
  2. package/dist/Cache.d.ts.map +1 -1
  3. package/dist/Cache.js +1 -1
  4. package/dist/Cache.js.map +1 -1
  5. package/dist/Cause.d.ts +1 -1
  6. package/dist/Cause.d.ts.map +1 -1
  7. package/dist/Channel.d.ts.map +1 -1
  8. package/dist/Channel.js +6 -4
  9. package/dist/Channel.js.map +1 -1
  10. package/dist/Combiner.d.ts +280 -13
  11. package/dist/Combiner.d.ts.map +1 -1
  12. package/dist/Combiner.js +198 -7
  13. package/dist/Combiner.js.map +1 -1
  14. package/dist/Config.d.ts +3 -3
  15. package/dist/Config.js +3 -3
  16. package/dist/Config.js.map +1 -1
  17. package/dist/ConfigProvider.d.ts +1 -1
  18. package/dist/Cron.d.ts +1 -1
  19. package/dist/Data.d.ts +534 -365
  20. package/dist/Data.d.ts.map +1 -1
  21. package/dist/Data.js +132 -79
  22. package/dist/Data.js.map +1 -1
  23. package/dist/DateTime.d.ts +23 -161
  24. package/dist/DateTime.d.ts.map +1 -1
  25. package/dist/DateTime.js +6 -51
  26. package/dist/DateTime.js.map +1 -1
  27. package/dist/Duration.d.ts +12 -12
  28. package/dist/Duration.d.ts.map +1 -1
  29. package/dist/Duration.js +12 -12
  30. package/dist/Duration.js.map +1 -1
  31. package/dist/Effect.d.ts +175 -240
  32. package/dist/Effect.d.ts.map +1 -1
  33. package/dist/Effect.js +73 -119
  34. package/dist/Effect.js.map +1 -1
  35. package/dist/Encoding.d.ts +194 -0
  36. package/dist/Encoding.d.ts.map +1 -0
  37. package/dist/Encoding.js +352 -0
  38. package/dist/Encoding.js.map +1 -0
  39. package/dist/Equal.d.ts +276 -109
  40. package/dist/Equal.d.ts.map +1 -1
  41. package/dist/Equal.js +124 -48
  42. package/dist/Equal.js.map +1 -1
  43. package/dist/FileSystem.d.ts +1 -1
  44. package/dist/FileSystem.d.ts.map +1 -1
  45. package/dist/FileSystem.js +5 -5
  46. package/dist/FileSystem.js.map +1 -1
  47. package/dist/Filter.d.ts +30 -1
  48. package/dist/Filter.d.ts.map +1 -1
  49. package/dist/Filter.js +15 -0
  50. package/dist/Filter.js.map +1 -1
  51. package/dist/Formatter.d.ts +131 -47
  52. package/dist/Formatter.d.ts.map +1 -1
  53. package/dist/Formatter.js +229 -51
  54. package/dist/Formatter.js.map +1 -1
  55. package/dist/Graph.d.ts +1 -1
  56. package/dist/Graph.d.ts.map +1 -1
  57. package/dist/Graph.js +2 -2
  58. package/dist/Graph.js.map +1 -1
  59. package/dist/JsonSchema.d.ts +299 -10
  60. package/dist/JsonSchema.d.ts.map +1 -1
  61. package/dist/JsonSchema.js +323 -4
  62. package/dist/JsonSchema.js.map +1 -1
  63. package/dist/Latch.d.ts +109 -0
  64. package/dist/Latch.d.ts.map +1 -0
  65. package/dist/Latch.js +72 -0
  66. package/dist/Latch.js.map +1 -0
  67. package/dist/LayerMap.d.ts +4 -4
  68. package/dist/LayerMap.d.ts.map +1 -1
  69. package/dist/LogLevel.d.ts +27 -0
  70. package/dist/LogLevel.d.ts.map +1 -1
  71. package/dist/LogLevel.js +28 -100
  72. package/dist/LogLevel.js.map +1 -1
  73. package/dist/Logger.d.ts +4 -4
  74. package/dist/Logger.d.ts.map +1 -1
  75. package/dist/Metric.d.ts +2 -2
  76. package/dist/Metric.d.ts.map +1 -1
  77. package/dist/Metric.js +1 -1
  78. package/dist/Metric.js.map +1 -1
  79. package/dist/Optic.d.ts +947 -18
  80. package/dist/Optic.d.ts.map +1 -1
  81. package/dist/Optic.js +454 -5
  82. package/dist/Optic.js.map +1 -1
  83. package/dist/Pipeable.d.ts +17 -0
  84. package/dist/Pipeable.d.ts.map +1 -1
  85. package/dist/Pipeable.js +19 -1
  86. package/dist/Pipeable.js.map +1 -1
  87. package/dist/PlatformError.d.ts +10 -9
  88. package/dist/PlatformError.d.ts.map +1 -1
  89. package/dist/PlatformError.js +2 -2
  90. package/dist/PlatformError.js.map +1 -1
  91. package/dist/Pool.d.ts +6 -4
  92. package/dist/Pool.d.ts.map +1 -1
  93. package/dist/Pool.js +7 -5
  94. package/dist/Pool.js.map +1 -1
  95. package/dist/PubSub.d.ts +3 -2
  96. package/dist/PubSub.d.ts.map +1 -1
  97. package/dist/PubSub.js +3 -2
  98. package/dist/PubSub.js.map +1 -1
  99. package/dist/Random.d.ts +18 -1
  100. package/dist/Random.d.ts.map +1 -1
  101. package/dist/Random.js +29 -12
  102. package/dist/Random.js.map +1 -1
  103. package/dist/RcMap.d.ts +2 -2
  104. package/dist/RcMap.d.ts.map +1 -1
  105. package/dist/RcMap.js +1 -1
  106. package/dist/RcMap.js.map +1 -1
  107. package/dist/RcRef.d.ts +1 -1
  108. package/dist/RcRef.d.ts.map +1 -1
  109. package/dist/Reducer.d.ts +166 -7
  110. package/dist/Reducer.d.ts.map +1 -1
  111. package/dist/Reducer.js +135 -1
  112. package/dist/Reducer.js.map +1 -1
  113. package/dist/Request.d.ts +1 -1
  114. package/dist/Request.d.ts.map +1 -1
  115. package/dist/Request.js +2 -1
  116. package/dist/Request.js.map +1 -1
  117. package/dist/RequestResolver.d.ts +6 -26
  118. package/dist/RequestResolver.d.ts.map +1 -1
  119. package/dist/RequestResolver.js +0 -20
  120. package/dist/RequestResolver.js.map +1 -1
  121. package/dist/Result.d.ts +12 -0
  122. package/dist/Result.d.ts.map +1 -1
  123. package/dist/Result.js +12 -0
  124. package/dist/Result.js.map +1 -1
  125. package/dist/Schedule.d.ts +33 -14
  126. package/dist/Schedule.d.ts.map +1 -1
  127. package/dist/Schedule.js +65 -24
  128. package/dist/Schedule.js.map +1 -1
  129. package/dist/Schema.d.ts +199 -49
  130. package/dist/Schema.d.ts.map +1 -1
  131. package/dist/Schema.js +386 -72
  132. package/dist/Schema.js.map +1 -1
  133. package/dist/SchemaGetter.d.ts +2 -2
  134. package/dist/SchemaGetter.d.ts.map +1 -1
  135. package/dist/SchemaGetter.js +12 -14
  136. package/dist/SchemaGetter.js.map +1 -1
  137. package/dist/SchemaRepresentation.d.ts +44 -43
  138. package/dist/SchemaRepresentation.d.ts.map +1 -1
  139. package/dist/SchemaRepresentation.js +43 -24
  140. package/dist/SchemaRepresentation.js.map +1 -1
  141. package/dist/SchemaTransformation.d.ts +37 -0
  142. package/dist/SchemaTransformation.d.ts.map +1 -1
  143. package/dist/SchemaTransformation.js +80 -0
  144. package/dist/SchemaTransformation.js.map +1 -1
  145. package/dist/ScopedCache.d.ts +2 -2
  146. package/dist/ScopedCache.d.ts.map +1 -1
  147. package/dist/ScopedCache.js +1 -1
  148. package/dist/ScopedCache.js.map +1 -1
  149. package/dist/Semaphore.d.ts +211 -0
  150. package/dist/Semaphore.d.ts.map +1 -0
  151. package/dist/{PartitionedSemaphore.js → Semaphore.js} +97 -13
  152. package/dist/Semaphore.js.map +1 -0
  153. package/dist/Stream.d.ts +19 -19
  154. package/dist/Stream.d.ts.map +1 -1
  155. package/dist/Stream.js +12 -11
  156. package/dist/Stream.js.map +1 -1
  157. package/dist/Struct.d.ts +16 -0
  158. package/dist/Struct.d.ts.map +1 -1
  159. package/dist/Struct.js +22 -0
  160. package/dist/Struct.js.map +1 -1
  161. package/dist/SubscriptionRef.d.ts +2 -1
  162. package/dist/SubscriptionRef.d.ts.map +1 -1
  163. package/dist/SubscriptionRef.js +2 -1
  164. package/dist/SubscriptionRef.js.map +1 -1
  165. package/dist/SynchronizedRef.d.ts +2 -1
  166. package/dist/SynchronizedRef.d.ts.map +1 -1
  167. package/dist/SynchronizedRef.js +2 -1
  168. package/dist/SynchronizedRef.js.map +1 -1
  169. package/dist/Types.d.ts +14 -6
  170. package/dist/Types.d.ts.map +1 -1
  171. package/dist/index.d.ts +499 -19
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +499 -19
  174. package/dist/index.js.map +1 -1
  175. package/dist/internal/core.js +11 -3
  176. package/dist/internal/core.js.map +1 -1
  177. package/dist/internal/dateTime.js +3 -11
  178. package/dist/internal/dateTime.js.map +1 -1
  179. package/dist/internal/effect.js +37 -22
  180. package/dist/internal/effect.js.map +1 -1
  181. package/dist/internal/random.d.ts +2 -0
  182. package/dist/internal/random.d.ts.map +1 -0
  183. package/dist/internal/random.js +13 -0
  184. package/dist/internal/random.js.map +1 -0
  185. package/dist/internal/rcRef.js +3 -2
  186. package/dist/internal/rcRef.js.map +1 -1
  187. package/dist/testing/TestClock.d.ts +7 -6
  188. package/dist/testing/TestClock.d.ts.map +1 -1
  189. package/dist/testing/TestClock.js +6 -4
  190. package/dist/testing/TestClock.js.map +1 -1
  191. package/dist/testing/TestSchema.d.ts +6 -6
  192. package/dist/testing/TestSchema.d.ts.map +1 -1
  193. package/dist/unstable/ai/AiError.d.ts +48 -48
  194. package/dist/unstable/ai/AiError.d.ts.map +1 -1
  195. package/dist/unstable/ai/Chat.d.ts +3 -3
  196. package/dist/unstable/ai/Chat.d.ts.map +1 -1
  197. package/dist/unstable/ai/Chat.js +4 -3
  198. package/dist/unstable/ai/Chat.js.map +1 -1
  199. package/dist/unstable/ai/LanguageModel.d.ts +2 -2
  200. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  201. package/dist/unstable/ai/McpSchema.d.ts +51 -51
  202. package/dist/unstable/ai/McpServer.d.ts +1 -1
  203. package/dist/unstable/ai/McpServer.d.ts.map +1 -1
  204. package/dist/unstable/ai/McpServer.js.map +1 -1
  205. package/dist/unstable/ai/Prompt.d.ts +20 -20
  206. package/dist/unstable/ai/Prompt.d.ts.map +1 -1
  207. package/dist/unstable/ai/Response.d.ts +26 -26
  208. package/dist/unstable/ai/Response.d.ts.map +1 -1
  209. package/dist/unstable/ai/Response.js +1 -1
  210. package/dist/unstable/ai/Response.js.map +1 -1
  211. package/dist/unstable/cli/CliError.d.ts +5 -5
  212. package/dist/unstable/cli/Prompt.js +2 -2
  213. package/dist/unstable/cli/Prompt.js.map +1 -1
  214. package/dist/unstable/cluster/ClusterCron.d.ts +1 -1
  215. package/dist/unstable/cluster/ClusterCron.d.ts.map +1 -1
  216. package/dist/unstable/cluster/ClusterCron.js +1 -1
  217. package/dist/unstable/cluster/ClusterCron.js.map +1 -1
  218. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  219. package/dist/unstable/cluster/ClusterWorkflowEngine.js +2 -1
  220. package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
  221. package/dist/unstable/cluster/Entity.d.ts +5 -4
  222. package/dist/unstable/cluster/Entity.d.ts.map +1 -1
  223. package/dist/unstable/cluster/Entity.js.map +1 -1
  224. package/dist/unstable/cluster/EntityResource.d.ts +2 -2
  225. package/dist/unstable/cluster/EntityResource.d.ts.map +1 -1
  226. package/dist/unstable/cluster/Envelope.d.ts +1 -1
  227. package/dist/unstable/cluster/K8sHttpClient.d.ts +1 -1
  228. package/dist/unstable/cluster/K8sHttpClient.js +1 -1
  229. package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
  230. package/dist/unstable/cluster/Message.d.ts +10 -10
  231. package/dist/unstable/cluster/MessageStorage.d.ts.map +1 -1
  232. package/dist/unstable/cluster/MessageStorage.js +2 -1
  233. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  234. package/dist/unstable/cluster/Reply.d.ts +6 -6
  235. package/dist/unstable/cluster/Runner.d.ts +1 -1
  236. package/dist/unstable/cluster/Runners.d.ts.map +1 -1
  237. package/dist/unstable/cluster/Runners.js +4 -3
  238. package/dist/unstable/cluster/Runners.js.map +1 -1
  239. package/dist/unstable/cluster/Sharding.d.ts +2 -2
  240. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  241. package/dist/unstable/cluster/Sharding.js +8 -6
  242. package/dist/unstable/cluster/Sharding.js.map +1 -1
  243. package/dist/unstable/cluster/ShardingConfig.d.ts +21 -21
  244. package/dist/unstable/cluster/ShardingConfig.d.ts.map +1 -1
  245. package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
  246. package/dist/unstable/cluster/SqlRunnerStorage.js +1 -1
  247. package/dist/unstable/cluster/SqlRunnerStorage.js.map +1 -1
  248. package/dist/unstable/cluster/internal/entityManager.js +5 -4
  249. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  250. package/dist/unstable/cluster/internal/entityReaper.js +2 -1
  251. package/dist/unstable/cluster/internal/entityReaper.js.map +1 -1
  252. package/dist/unstable/cluster/internal/resourceRef.js +2 -1
  253. package/dist/unstable/cluster/internal/resourceRef.js.map +1 -1
  254. package/dist/unstable/devtools/DevToolsSchema.d.ts +36 -36
  255. package/dist/unstable/encoding/Msgpack.d.ts +1 -1
  256. package/dist/unstable/encoding/Ndjson.d.ts +1 -1
  257. package/dist/unstable/encoding/Sse.d.ts +4 -4
  258. package/dist/unstable/encoding/Sse.d.ts.map +1 -1
  259. package/dist/unstable/encoding/Sse.js.map +1 -1
  260. package/dist/unstable/eventlog/EventJournal.d.ts +2 -2
  261. package/dist/unstable/eventlog/EventLog.d.ts.map +1 -1
  262. package/dist/unstable/eventlog/EventLog.js +2 -1
  263. package/dist/unstable/eventlog/EventLog.js.map +1 -1
  264. package/dist/unstable/eventlog/EventLogRemote.d.ts +6 -6
  265. package/dist/unstable/http/Cookies.d.ts +3 -3
  266. package/dist/unstable/http/Cookies.d.ts.map +1 -1
  267. package/dist/unstable/http/Cookies.js +2 -2
  268. package/dist/unstable/http/Cookies.js.map +1 -1
  269. package/dist/unstable/http/HttpBody.d.ts +17 -2
  270. package/dist/unstable/http/HttpBody.d.ts.map +1 -1
  271. package/dist/unstable/http/HttpBody.js +28 -1
  272. package/dist/unstable/http/HttpBody.js.map +1 -1
  273. package/dist/unstable/http/HttpClient.d.ts +11 -11
  274. package/dist/unstable/http/HttpClient.d.ts.map +1 -1
  275. package/dist/unstable/http/HttpClient.js +4 -4
  276. package/dist/unstable/http/HttpClient.js.map +1 -1
  277. package/dist/unstable/http/HttpClientError.d.ts +7 -7
  278. package/dist/unstable/http/HttpClientRequest.d.ts +27 -11
  279. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  280. package/dist/unstable/http/HttpClientRequest.js +15 -3
  281. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  282. package/dist/unstable/http/HttpEffect.d.ts.map +1 -1
  283. package/dist/unstable/http/HttpEffect.js +18 -26
  284. package/dist/unstable/http/HttpEffect.js.map +1 -1
  285. package/dist/unstable/http/HttpMethod.d.ts +4 -4
  286. package/dist/unstable/http/HttpMethod.d.ts.map +1 -1
  287. package/dist/unstable/http/HttpMethod.js +3 -3
  288. package/dist/unstable/http/HttpMethod.js.map +1 -1
  289. package/dist/unstable/http/HttpMiddleware.d.ts +1 -6
  290. package/dist/unstable/http/HttpMiddleware.d.ts.map +1 -1
  291. package/dist/unstable/http/HttpMiddleware.js +4 -9
  292. package/dist/unstable/http/HttpMiddleware.js.map +1 -1
  293. package/dist/unstable/http/HttpServerError.d.ts +6 -6
  294. package/dist/unstable/http/HttpServerResponse.js +1 -1
  295. package/dist/unstable/http/HttpServerResponse.js.map +1 -1
  296. package/dist/unstable/http/Multipart.d.ts +3 -3
  297. package/dist/unstable/http/UrlParams.d.ts +14 -6
  298. package/dist/unstable/http/UrlParams.d.ts.map +1 -1
  299. package/dist/unstable/http/UrlParams.js +1 -1
  300. package/dist/unstable/http/UrlParams.js.map +1 -1
  301. package/dist/unstable/httpapi/HttpApiBuilder.js +5 -5
  302. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  303. package/dist/unstable/httpapi/HttpApiClient.js +3 -3
  304. package/dist/unstable/httpapi/HttpApiClient.js.map +1 -1
  305. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts +21 -39
  306. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts.map +1 -1
  307. package/dist/unstable/httpapi/HttpApiEndpoint.js +15 -24
  308. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  309. package/dist/unstable/httpapi/HttpApiScalar.d.ts +6 -0
  310. package/dist/unstable/httpapi/HttpApiScalar.d.ts.map +1 -1
  311. package/dist/unstable/httpapi/HttpApiScalar.js.map +1 -1
  312. package/dist/unstable/httpapi/OpenApi.d.ts.map +1 -1
  313. package/dist/unstable/httpapi/OpenApi.js +18 -16
  314. package/dist/unstable/httpapi/OpenApi.js.map +1 -1
  315. package/dist/unstable/observability/Otlp.d.ts +12 -12
  316. package/dist/unstable/observability/Otlp.d.ts.map +1 -1
  317. package/dist/unstable/observability/OtlpExporter.d.ts +2 -2
  318. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  319. package/dist/unstable/observability/OtlpExporter.js +1 -1
  320. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  321. package/dist/unstable/observability/OtlpLogger.d.ts +4 -4
  322. package/dist/unstable/observability/OtlpLogger.d.ts.map +1 -1
  323. package/dist/unstable/observability/OtlpMetrics.d.ts +4 -4
  324. package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
  325. package/dist/unstable/observability/OtlpTracer.d.ts +4 -4
  326. package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
  327. package/dist/unstable/persistence/KeyValueStore.d.ts +1 -1
  328. package/dist/unstable/persistence/KeyValueStore.js +6 -6
  329. package/dist/unstable/persistence/KeyValueStore.js.map +1 -1
  330. package/dist/unstable/persistence/Persistable.d.ts +2 -2
  331. package/dist/unstable/persistence/Persistable.d.ts.map +1 -1
  332. package/dist/unstable/persistence/PersistedCache.d.ts +6 -5
  333. package/dist/unstable/persistence/PersistedCache.d.ts.map +1 -1
  334. package/dist/unstable/persistence/PersistedCache.js +2 -1
  335. package/dist/unstable/persistence/PersistedCache.js.map +1 -1
  336. package/dist/unstable/persistence/PersistedQueue.d.ts +12 -12
  337. package/dist/unstable/persistence/PersistedQueue.d.ts.map +1 -1
  338. package/dist/unstable/persistence/PersistedQueue.js +12 -11
  339. package/dist/unstable/persistence/PersistedQueue.js.map +1 -1
  340. package/dist/unstable/persistence/Persistence.d.ts +1 -1
  341. package/dist/unstable/persistence/Persistence.d.ts.map +1 -1
  342. package/dist/unstable/persistence/Persistence.js +2 -2
  343. package/dist/unstable/persistence/Persistence.js.map +1 -1
  344. package/dist/unstable/persistence/RateLimiter.d.ts +3 -3
  345. package/dist/unstable/persistence/RateLimiter.d.ts.map +1 -1
  346. package/dist/unstable/persistence/RateLimiter.js +1 -1
  347. package/dist/unstable/persistence/RateLimiter.js.map +1 -1
  348. package/dist/unstable/process/ChildProcess.d.ts +2 -2
  349. package/dist/unstable/process/ChildProcess.d.ts.map +1 -1
  350. package/dist/unstable/process/ChildProcessSpawner.d.ts +6 -0
  351. package/dist/unstable/process/ChildProcessSpawner.d.ts.map +1 -1
  352. package/dist/unstable/process/ChildProcessSpawner.js.map +1 -1
  353. package/dist/unstable/reactivity/Atom.d.ts +6 -6
  354. package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
  355. package/dist/unstable/reactivity/Atom.js +15 -12
  356. package/dist/unstable/reactivity/Atom.js.map +1 -1
  357. package/dist/unstable/reactivity/AtomHttpApi.d.ts +6 -6
  358. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  359. package/dist/unstable/reactivity/AtomHttpApi.js +3 -3
  360. package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
  361. package/dist/unstable/reactivity/AtomRpc.d.ts +1 -1
  362. package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
  363. package/dist/unstable/reactivity/AtomRpc.js +1 -1
  364. package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
  365. package/dist/unstable/reactivity/Hydration.d.ts +39 -0
  366. package/dist/unstable/reactivity/Hydration.d.ts.map +1 -0
  367. package/dist/unstable/reactivity/Hydration.js +76 -0
  368. package/dist/unstable/reactivity/Hydration.js.map +1 -0
  369. package/dist/unstable/reactivity/index.d.ts +4 -0
  370. package/dist/unstable/reactivity/index.d.ts.map +1 -1
  371. package/dist/unstable/reactivity/index.js +4 -0
  372. package/dist/unstable/reactivity/index.js.map +1 -1
  373. package/dist/unstable/rpc/Rpc.d.ts +2 -2
  374. package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
  375. package/dist/unstable/rpc/RpcClient.d.ts +5 -26
  376. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  377. package/dist/unstable/rpc/RpcClient.js +6 -13
  378. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  379. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  380. package/dist/unstable/rpc/RpcServer.js +5 -3
  381. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  382. package/dist/unstable/rpc/Utils.d.ts.map +1 -1
  383. package/dist/unstable/rpc/Utils.js +2 -1
  384. package/dist/unstable/rpc/Utils.js.map +1 -1
  385. package/dist/unstable/schema/Model.d.ts +4 -4
  386. package/dist/unstable/schema/Model.d.ts.map +1 -1
  387. package/dist/unstable/schema/VariantSchema.d.ts +2 -2
  388. package/dist/unstable/schema/VariantSchema.d.ts.map +1 -1
  389. package/dist/unstable/schema/VariantSchema.js +13 -2
  390. package/dist/unstable/schema/VariantSchema.js.map +1 -1
  391. package/dist/unstable/socket/Socket.d.ts +4 -4
  392. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  393. package/dist/unstable/socket/Socket.js +3 -2
  394. package/dist/unstable/socket/Socket.js.map +1 -1
  395. package/dist/unstable/socket/SocketServer.d.ts +3 -3
  396. package/dist/unstable/sql/Migrator.d.ts +1 -1
  397. package/dist/unstable/sql/SqlError.d.ts +2 -2
  398. package/dist/unstable/sql/SqlModel.d.ts +2 -2
  399. package/dist/unstable/sql/SqlModel.d.ts.map +1 -1
  400. package/dist/unstable/sql/SqlSchema.d.ts +24 -1
  401. package/dist/unstable/sql/SqlSchema.d.ts.map +1 -1
  402. package/dist/unstable/sql/SqlSchema.js +24 -3
  403. package/dist/unstable/sql/SqlSchema.js.map +1 -1
  404. package/dist/unstable/sql/Statement.js +0 -1
  405. package/dist/unstable/sql/Statement.js.map +1 -1
  406. package/dist/unstable/workers/Worker.d.ts.map +1 -1
  407. package/dist/unstable/workers/Worker.js +2 -1
  408. package/dist/unstable/workers/Worker.js.map +1 -1
  409. package/dist/unstable/workflow/DurableClock.d.ts +3 -3
  410. package/dist/unstable/workflow/DurableClock.d.ts.map +1 -1
  411. package/dist/unstable/workflow/DurableClock.js +3 -3
  412. package/dist/unstable/workflow/DurableClock.js.map +1 -1
  413. package/dist/unstable/workflow/DurableDeferred.js +2 -2
  414. package/dist/unstable/workflow/DurableDeferred.js.map +1 -1
  415. package/dist/unstable/workflow/Workflow.d.ts +2 -2
  416. package/dist/unstable/workflow/WorkflowEngine.d.ts +2 -1
  417. package/dist/unstable/workflow/WorkflowEngine.d.ts.map +1 -1
  418. package/dist/unstable/workflow/WorkflowEngine.js +2 -1
  419. package/dist/unstable/workflow/WorkflowEngine.js.map +1 -1
  420. package/package.json +2 -2
  421. package/src/Cache.ts +3 -3
  422. package/src/Cause.ts +1 -1
  423. package/src/Channel.ts +6 -4
  424. package/src/Combiner.ts +280 -13
  425. package/src/Config.ts +3 -3
  426. package/src/Data.ts +538 -374
  427. package/src/DateTime.ts +24 -164
  428. package/src/Duration.ts +15 -15
  429. package/src/Effect.ts +202 -261
  430. package/src/Encoding.ts +879 -0
  431. package/src/Equal.ts +278 -111
  432. package/src/FileSystem.ts +7 -8
  433. package/src/Filter.ts +48 -1
  434. package/src/Formatter.ts +253 -51
  435. package/src/Graph.ts +8 -5
  436. package/src/JsonSchema.ts +383 -10
  437. package/src/Latch.ts +112 -0
  438. package/src/LayerMap.ts +5 -5
  439. package/src/LogLevel.ts +31 -0
  440. package/src/Logger.ts +5 -5
  441. package/src/Metric.ts +4 -4
  442. package/src/Optic.ts +948 -19
  443. package/src/Pipeable.ts +32 -1
  444. package/src/PlatformError.ts +5 -5
  445. package/src/Pool.ts +13 -11
  446. package/src/PubSub.ts +10 -9
  447. package/src/Random.ts +33 -14
  448. package/src/RcMap.ts +5 -5
  449. package/src/RcRef.ts +1 -1
  450. package/src/Reducer.ts +166 -7
  451. package/src/Request.ts +3 -2
  452. package/src/RequestResolver.ts +9 -29
  453. package/src/Result.ts +13 -0
  454. package/src/Schedule.ts +279 -140
  455. package/src/Schema.ts +575 -113
  456. package/src/SchemaGetter.ts +12 -14
  457. package/src/SchemaRepresentation.ts +43 -24
  458. package/src/SchemaTransformation.ts +104 -0
  459. package/src/ScopedCache.ts +3 -3
  460. package/src/Semaphore.ts +356 -0
  461. package/src/Stream.ts +43 -42
  462. package/src/Struct.ts +26 -0
  463. package/src/SubscriptionRef.ts +3 -2
  464. package/src/SynchronizedRef.ts +3 -2
  465. package/src/Types.ts +12 -2
  466. package/src/index.ts +502 -20
  467. package/src/internal/core.ts +12 -5
  468. package/src/internal/dateTime.ts +9 -30
  469. package/src/internal/effect.ts +70 -37
  470. package/src/internal/random.ts +20 -0
  471. package/src/internal/rcRef.ts +4 -3
  472. package/src/testing/TestClock.ts +13 -11
  473. package/src/testing/TestSchema.ts +8 -8
  474. package/src/unstable/ai/AiError.ts +2 -2
  475. package/src/unstable/ai/Chat.ts +12 -11
  476. package/src/unstable/ai/LanguageModel.ts +3 -3
  477. package/src/unstable/ai/McpServer.ts +2 -2
  478. package/src/unstable/ai/Prompt.ts +37 -37
  479. package/src/unstable/ai/Response.ts +25 -25
  480. package/src/unstable/cli/Prompt.ts +2 -2
  481. package/src/unstable/cluster/ClusterCron.ts +2 -2
  482. package/src/unstable/cluster/ClusterWorkflowEngine.ts +3 -2
  483. package/src/unstable/cluster/Entity.ts +7 -6
  484. package/src/unstable/cluster/EntityResource.ts +4 -4
  485. package/src/unstable/cluster/Envelope.ts +1 -1
  486. package/src/unstable/cluster/K8sHttpClient.ts +1 -1
  487. package/src/unstable/cluster/MessageStorage.ts +3 -5
  488. package/src/unstable/cluster/Runners.ts +6 -5
  489. package/src/unstable/cluster/Sharding.ts +11 -9
  490. package/src/unstable/cluster/ShardingConfig.ts +10 -11
  491. package/src/unstable/cluster/SqlRunnerStorage.ts +1 -1
  492. package/src/unstable/cluster/internal/entityManager.ts +9 -8
  493. package/src/unstable/cluster/internal/entityReaper.ts +2 -1
  494. package/src/unstable/cluster/internal/resourceRef.ts +2 -1
  495. package/src/unstable/encoding/Sse.ts +2 -4
  496. package/src/unstable/eventlog/EventLog.ts +2 -1
  497. package/src/unstable/http/Cookies.ts +3 -3
  498. package/src/unstable/http/HttpBody.ts +42 -1
  499. package/src/unstable/http/HttpClient.ts +19 -19
  500. package/src/unstable/http/HttpClientRequest.ts +38 -13
  501. package/src/unstable/http/HttpEffect.ts +17 -25
  502. package/src/unstable/http/HttpMethod.ts +16 -4
  503. package/src/unstable/http/HttpMiddleware.ts +5 -10
  504. package/src/unstable/http/HttpServerResponse.ts +1 -1
  505. package/src/unstable/http/Multipart.ts +2 -2
  506. package/src/unstable/http/UrlParams.ts +20 -5
  507. package/src/unstable/httpapi/HttpApiBuilder.ts +5 -5
  508. package/src/unstable/httpapi/HttpApiClient.ts +3 -3
  509. package/src/unstable/httpapi/HttpApiEndpoint.ts +47 -72
  510. package/src/unstable/httpapi/HttpApiScalar.ts +6 -0
  511. package/src/unstable/httpapi/OpenApi.ts +18 -16
  512. package/src/unstable/observability/Otlp.ts +12 -12
  513. package/src/unstable/observability/OtlpExporter.ts +3 -3
  514. package/src/unstable/observability/OtlpLogger.ts +4 -4
  515. package/src/unstable/observability/OtlpMetrics.ts +4 -4
  516. package/src/unstable/observability/OtlpTracer.ts +4 -4
  517. package/src/unstable/persistence/KeyValueStore.ts +6 -6
  518. package/src/unstable/persistence/Persistable.ts +2 -2
  519. package/src/unstable/persistence/PersistedCache.ts +20 -9
  520. package/src/unstable/persistence/PersistedQueue.ts +25 -24
  521. package/src/unstable/persistence/Persistence.ts +3 -3
  522. package/src/unstable/persistence/RateLimiter.ts +4 -4
  523. package/src/unstable/process/ChildProcess.ts +2 -2
  524. package/src/unstable/process/ChildProcessSpawner.ts +6 -0
  525. package/src/unstable/reactivity/Atom.ts +20 -18
  526. package/src/unstable/reactivity/AtomHttpApi.ts +19 -18
  527. package/src/unstable/reactivity/AtomRpc.ts +3 -3
  528. package/src/unstable/reactivity/Hydration.ts +112 -0
  529. package/src/unstable/reactivity/index.ts +5 -0
  530. package/src/unstable/rpc/Rpc.ts +3 -3
  531. package/src/unstable/rpc/RpcClient.ts +12 -54
  532. package/src/unstable/rpc/RpcServer.ts +6 -4
  533. package/src/unstable/rpc/Utils.ts +2 -1
  534. package/src/unstable/schema/VariantSchema.ts +36 -7
  535. package/src/unstable/socket/Socket.ts +7 -6
  536. package/src/unstable/sql/SqlModel.ts +2 -2
  537. package/src/unstable/sql/SqlSchema.ts +62 -13
  538. package/src/unstable/sql/Statement.ts +0 -1
  539. package/src/unstable/workers/Worker.ts +2 -1
  540. package/src/unstable/workflow/DurableClock.ts +8 -8
  541. package/src/unstable/workflow/DurableDeferred.ts +2 -2
  542. package/src/unstable/workflow/WorkflowEngine.ts +3 -2
  543. package/dist/PartitionedSemaphore.d.ts +0 -52
  544. package/dist/PartitionedSemaphore.d.ts.map +0 -1
  545. package/dist/PartitionedSemaphore.js.map +0 -1
  546. package/dist/encoding/Base64.d.ts +0 -67
  547. package/dist/encoding/Base64.d.ts.map +0 -1
  548. package/dist/encoding/Base64.js +0 -146
  549. package/dist/encoding/Base64.js.map +0 -1
  550. package/dist/encoding/Base64Url.d.ts +0 -60
  551. package/dist/encoding/Base64Url.d.ts.map +0 -1
  552. package/dist/encoding/Base64Url.js +0 -89
  553. package/dist/encoding/Base64Url.js.map +0 -1
  554. package/dist/encoding/EncodingError.d.ts +0 -31
  555. package/dist/encoding/EncodingError.d.ts.map +0 -1
  556. package/dist/encoding/EncodingError.js +0 -22
  557. package/dist/encoding/EncodingError.js.map +0 -1
  558. package/dist/encoding/Hex.d.ts +0 -61
  559. package/dist/encoding/Hex.d.ts.map +0 -1
  560. package/dist/encoding/Hex.js +0 -115
  561. package/dist/encoding/Hex.js.map +0 -1
  562. package/dist/encoding/index.d.ts +0 -26
  563. package/dist/encoding/index.d.ts.map +0 -1
  564. package/dist/encoding/index.js +0 -27
  565. package/dist/encoding/index.js.map +0 -1
  566. package/src/PartitionedSemaphore.ts +0 -182
  567. package/src/encoding/Base64.ts +0 -366
  568. package/src/encoding/Base64Url.ts +0 -104
  569. package/src/encoding/EncodingError.ts +0 -35
  570. package/src/encoding/Hex.ts +0 -390
  571. package/src/encoding/index.ts +0 -31
package/src/Equal.ts CHANGED
@@ -1,7 +1,71 @@
1
1
  /**
2
- * This module provides functionality for defining and working with equality between values.
3
- * It includes the `Equal` interface for types that can determine equality with other values
4
- * of the same type, and utilities for comparing values.
2
+ * Structural and custom equality for Effect values.
3
+ *
4
+ * The `Equal` module provides deep structural comparison for primitives, plain
5
+ * objects, arrays, Maps, Sets, Dates, and RegExps. Types that implement the
6
+ * {@link Equal} interface can supply their own comparison logic while staying
7
+ * compatible with the rest of the ecosystem (HashMap, HashSet, etc.).
8
+ *
9
+ * ## Mental model
10
+ *
11
+ * - **Structural equality** — two values are equal when their contents match,
12
+ * not when they share the same reference.
13
+ * - **Hash-first shortcut** — before comparing fields, the module checks
14
+ * {@link Hash.hash}. If the hashes differ the objects are unequal without
15
+ * further traversal.
16
+ * - **Equal interface** — any object that implements both {@link symbol} (the
17
+ * equality method) and `Hash.symbol` (the hash method) can define custom
18
+ * comparison logic.
19
+ * - **Caching** — comparison results for object pairs are cached in a WeakMap.
20
+ * This makes repeated checks fast but **requires immutability** after the
21
+ * first comparison.
22
+ * - **By-reference opt-out** — {@link byReference} and {@link byReferenceUnsafe}
23
+ * let you switch individual objects back to reference equality when you need
24
+ * mutable identity semantics.
25
+ *
26
+ * ## Common tasks
27
+ *
28
+ * - Compare two values → {@link equals}
29
+ * - Check if a value implements `Equal` → {@link isEqual}
30
+ * - Use `equals` where an `Equivalence` is expected → {@link asEquivalence}
31
+ * - Implement custom equality on a class → implement {@link Equal} (see
32
+ * example on the interface)
33
+ * - Opt an object out of structural equality → {@link byReference} /
34
+ * {@link byReferenceUnsafe}
35
+ *
36
+ * ## Gotchas
37
+ *
38
+ * - Objects **must be treated as immutable** after their first equality check.
39
+ * Results are cached; mutating an object afterwards yields stale results.
40
+ * - `NaN` is considered equal to `NaN` (unlike `===`).
41
+ * - Functions without an `Equal` implementation are compared by reference.
42
+ * - Map and Set comparisons are order-independent but O(n²) in size.
43
+ * - If only one of two objects implements `Equal`, they are never equal.
44
+ *
45
+ * ## Quickstart
46
+ *
47
+ * **Example** (basic structural comparison)
48
+ *
49
+ * ```ts
50
+ * import { Equal } from "effect"
51
+ *
52
+ * // Primitives
53
+ * console.log(Equal.equals(1, 1)) // true
54
+ * console.log(Equal.equals("a", "b")) // false
55
+ *
56
+ * // Objects and arrays
57
+ * console.log(Equal.equals({ x: 1 }, { x: 1 })) // true
58
+ * console.log(Equal.equals([1, 2], [1, 2])) // true
59
+ *
60
+ * // Curried form
61
+ * const is42 = Equal.equals(42)
62
+ * console.log(is42(42)) // true
63
+ * console.log(is42(0)) // false
64
+ * ```
65
+ *
66
+ * @see {@link equals} — the main comparison function
67
+ * @see {@link Equal} — the interface for custom equality
68
+ * @see {@link Hash} — the companion hashing module
5
69
  *
6
70
  * @since 2.0.0
7
71
  */
@@ -11,17 +75,67 @@ import { byReferenceInstances, getAllObjectKeys } from "./internal/equal.ts"
11
75
  import { hasProperty } from "./Predicate.ts"
12
76
 
13
77
  /**
14
- * The unique identifier used to identify objects that implement the `Equal` interface.
78
+ * The unique string identifier for the {@link Equal} interface.
79
+ *
80
+ * Use this as a computed property key when implementing custom equality on a
81
+ * class or object literal.
82
+ *
83
+ * When to use:
84
+ * - As the method name when implementing the {@link Equal} interface.
85
+ * - To check manually whether an object carries an equality method (prefer
86
+ * {@link isEqual} instead).
87
+ *
88
+ * Behavior:
89
+ * - Pure constant — no allocation or side effects.
90
+ *
91
+ * **Example** (implementing Equal on a class)
92
+ *
93
+ * ```ts
94
+ * import { Equal, Hash } from "effect"
95
+ *
96
+ * class UserId implements Equal.Equal {
97
+ * constructor(readonly id: string) {}
98
+ *
99
+ * [Equal.symbol](that: Equal.Equal): boolean {
100
+ * return that instanceof UserId && this.id === that.id
101
+ * }
102
+ *
103
+ * [Hash.symbol](): number {
104
+ * return Hash.string(this.id)
105
+ * }
106
+ * }
107
+ * ```
108
+ *
109
+ * @see {@link Equal} — the interface that uses this symbol
110
+ * @see {@link isEqual} — type guard for `Equal` implementors
15
111
  *
16
112
  * @since 2.0.0
17
113
  */
18
114
  export const symbol = "~effect/interfaces/Equal"
19
115
 
20
116
  /**
21
- * An interface defining objects that can determine equality with other `Equal` objects.
22
- * Objects implementing this interface must also implement `Hash` for consistency.
117
+ * The interface for types that define their own equality logic.
118
+ *
119
+ * Any object that implements both `[Equal.symbol]` (equality) and
120
+ * `[Hash.symbol]` (hashing) is recognized by {@link equals} and by
121
+ * hash-based collections such as `HashMap` and `HashSet`.
122
+ *
123
+ * When to use:
124
+ * - When you need value-based equality for a class (e.g. domain IDs,
125
+ * coordinates, money values).
126
+ * - When your type will be stored in `HashMap` or `HashSet`.
127
+ * - When the default structural comparison is too broad or too narrow for
128
+ * your type.
129
+ *
130
+ * Behavior:
131
+ * - Extends `Hash.Hash`, so implementors **must** also provide `[Hash.symbol]`.
132
+ * - The hash contract: if `a[Equal.symbol](b)` returns `true`, then
133
+ * `Hash.hash(a)` must equal `Hash.hash(b)`.
134
+ * - {@link equals} delegates to this method when both operands implement it.
135
+ * If only one operand implements `Equal`, they are considered unequal.
136
+ *
137
+ * **Example** (coordinate with value equality)
23
138
  *
24
- * @example
25
139
  * ```ts
26
140
  * import { Equal, Hash } from "effect"
27
141
  *
@@ -38,8 +152,15 @@ export const symbol = "~effect/interfaces/Equal"
38
152
  * return Hash.string(`${this.x},${this.y}`)
39
153
  * }
40
154
  * }
155
+ *
156
+ * console.log(Equal.equals(new Coordinate(1, 2), new Coordinate(1, 2))) // true
157
+ * console.log(Equal.equals(new Coordinate(1, 2), new Coordinate(3, 4))) // false
41
158
  * ```
42
159
  *
160
+ * @see {@link symbol} — the property key used by the equality method
161
+ * @see {@link equals} — the main comparison function
162
+ * @see {@link isEqual} — type guard for `Equal` implementors
163
+ *
43
164
  * @category models
44
165
  * @since 2.0.0
45
166
  */
@@ -48,65 +169,67 @@ export interface Equal extends Hash.Hash {
48
169
  }
49
170
 
50
171
  /**
51
- * Compares two values for structural equality. Returns `true` if the values are structurally equal, `false` otherwise.
52
- *
53
- * This function performs deep structural comparison:
54
- * - For primitive values: uses value equality (including NaN === NaN)
55
- * - For objects implementing `Equal` interface: uses their custom equality logic
56
- * - For Date objects: compares ISO string representations
57
- * - For RegExp objects: compares string representations
58
- * - For Arrays: recursively compares each element
59
- * - For Maps: compares keys and values structurally (order-independent)
60
- * - For Sets: compares values structurally (order-independent)
61
- * - For plain objects: compares all properties recursively
62
- * - Handles circular references correctly
63
- *
64
- * **Performance**: Results of object comparisons are cached using WeakMaps to optimize
65
- * repeated equality checks between the same object pairs.
66
- *
67
- * **⚠️ CRITICAL IMMUTABILITY REQUIREMENT**: Objects being compared must be treated as
68
- * immutable after their first equality computation. Equality results are cached, so
69
- * mutating an object after comparison will lead to stale cached values and incorrect
70
- * equality results. For mutable objects, use referential equality by implementing
71
- * custom `Equal` interface that compares object references, not content.
72
- *
73
- * **FORBIDDEN**: Modifying objects after `Equal.equals()` has been called on them
74
- * **ALLOWED**: Using immutable objects, or mutable objects with custom `Equal` interface
75
- * that uses referential equality (compares object references, not content)
76
- *
77
- * @example
172
+ * Compares two values for deep structural equality.
173
+ *
174
+ * When to use:
175
+ * - As the default equality check throughout Effect code.
176
+ * - In data-level assertions or conditional logic where structural comparison
177
+ * is needed.
178
+ * - In its curried (single-argument) form to build reusable predicates.
179
+ *
180
+ * Behavior:
181
+ * - Returns a `boolean`; never throws.
182
+ * - Primitives: compared by value. `NaN` equals `NaN`.
183
+ * - Objects implementing {@link Equal}: delegates to their
184
+ * `[Equal.symbol]` method. If only one operand implements `Equal`, the
185
+ * result is `false`.
186
+ * - Dates: compared by ISO string representation.
187
+ * - RegExps: compared by string representation.
188
+ * - Arrays: element-by-element recursive comparison (order matters).
189
+ * - Maps / Sets: structural comparison of entries (order-independent, O(n²)).
190
+ * - Plain objects: all own and inherited enumerable keys are compared
191
+ * recursively.
192
+ * - Functions without an `Equal` implementation are compared by reference.
193
+ * - Circular references are handled; two structures that are circular at the
194
+ * same depth are considered equal.
195
+ * - Hash values are checked first as a fast-path rejection.
196
+ * - Results are cached per object pair in a WeakMap. **Objects must not be
197
+ * mutated after their first comparison.**
198
+ * - Supports dual (data-last) usage: call with one argument to get a curried
199
+ * predicate.
200
+ *
201
+ * **Example** (comparing values)
202
+ *
78
203
  * ```ts
79
204
  * import { Equal } from "effect"
80
- * import * as assert from "node:assert"
81
- *
82
- * // Primitive values
83
- * assert(Equal.equals(1, 1) === true)
84
- * assert(Equal.equals(NaN, NaN) === true)
85
- *
86
- * // Objects - structural comparison
87
- * assert(Equal.equals({ a: 1, b: 2 }, { a: 1, b: 2 }) === true)
88
- * assert(Equal.equals({ a: 1 }, { a: 1, b: 2 }) === false)
89
- *
90
- * // Arrays - recursive comparison
91
- * assert(Equal.equals([1, [2, 3]], [1, [2, 3]]) === true)
92
- * assert(Equal.equals([1, 2], [1, 3]) === false)
93
- *
94
- * // Date equality by ISO string
95
- * const date1 = new Date("2023-01-01")
96
- * const date2 = new Date("2023-01-01")
97
- * assert(Equal.equals(date1, date2) === true)
98
- *
99
- * // Maps and Sets - structural comparison
100
- * const map1 = new Map([["a", 1], ["b", 2]])
101
- * const map2 = new Map([["b", 2], ["a", 1]]) // different order
102
- * assert(Equal.equals(map1, map2) === true)
103
- *
104
- * // Curried version
105
- * const isEqualTo5 = Equal.equals(5)
106
- * assert(isEqualTo5(5) === true)
107
- * assert(isEqualTo5(3) === false)
205
+ *
206
+ * // Primitives
207
+ * console.log(Equal.equals(1, 1)) // true
208
+ * console.log(Equal.equals(NaN, NaN)) // true
209
+ * console.log(Equal.equals("a", "b")) // false
210
+ *
211
+ * // Objects and arrays
212
+ * console.log(Equal.equals({ a: 1, b: 2 }, { a: 1, b: 2 })) // true
213
+ * console.log(Equal.equals([1, [2, 3]], [1, [2, 3]])) // true
214
+ *
215
+ * // Dates
216
+ * console.log(Equal.equals(new Date("2024-01-01"), new Date("2024-01-01"))) // true
217
+ *
218
+ * // Maps (order-independent)
219
+ * const m1 = new Map([["a", 1], ["b", 2]])
220
+ * const m2 = new Map([["b", 2], ["a", 1]])
221
+ * console.log(Equal.equals(m1, m2)) // true
222
+ *
223
+ * // Curried form
224
+ * const is5 = Equal.equals(5)
225
+ * console.log(is5(5)) // true
226
+ * console.log(is5(3)) // false
108
227
  * ```
109
228
  *
229
+ * @see {@link Equal} — the interface for custom equality
230
+ * @see {@link isEqual} — check whether a value implements `Equal`
231
+ * @see {@link asEquivalence} — wrap `equals` as an `Equivalence`
232
+ *
110
233
  * @category equality
111
234
  * @since 2.0.0
112
235
  */
@@ -269,7 +392,7 @@ function compareRecords(
269
392
 
270
393
  /** @internal */
271
394
  export function makeCompareMap<K, V>(keyEquivalence: Equivalence<K>, valueEquivalence: Equivalence<V>) {
272
- return function compareMaps(self: ReadonlyMap<K, V>, that: ReadonlyMap<K, V>): boolean {
395
+ return function compareMaps(self: Iterable<[K, V]>, that: Iterable<[K, V]>): boolean {
273
396
  for (const [selfKey, selfValue] of self) {
274
397
  let found = false
275
398
  for (const [thatKey, thatValue] of that) {
@@ -291,7 +414,7 @@ const compareMaps = makeCompareMap(compareBoth, compareBoth)
291
414
 
292
415
  /** @internal */
293
416
  export function makeCompareSet<A>(equivalence: Equivalence<A>) {
294
- return function compareSets(self: ReadonlySet<A>, that: ReadonlySet<A>): boolean {
417
+ return function compareSets(self: Iterable<A>, that: Iterable<A>): boolean {
295
418
  for (const selfValue of self) {
296
419
  let found = false
297
420
  for (const thatValue of that) {
@@ -312,38 +435,62 @@ export function makeCompareSet<A>(equivalence: Equivalence<A>) {
312
435
  const compareSets = makeCompareSet(compareBoth)
313
436
 
314
437
  /**
315
- * Determines if a value implements the `Equal` interface.
438
+ * Checks whether a value implements the {@link Equal} interface.
439
+ *
440
+ * When to use:
441
+ * - To branch on whether a value supports custom equality before calling
442
+ * its `[Equal.symbol]` method directly.
443
+ * - In generic utility code that needs to distinguish `Equal` implementors
444
+ * from plain values.
445
+ *
446
+ * Behavior:
447
+ * - Pure function, no side effects.
448
+ * - Returns `true` if and only if `u` has a property keyed by
449
+ * {@link symbol}.
450
+ * - Acts as a TypeScript type guard, narrowing the input to {@link Equal}.
451
+ *
452
+ * **Example** (type guard)
316
453
  *
317
- * @example
318
454
  * ```ts
319
455
  * import { Equal, Hash } from "effect"
320
- * import * as assert from "node:assert"
321
456
  *
322
- * class MyClass implements Equal.Equal {
457
+ * class Token implements Equal.Equal {
458
+ * constructor(readonly value: string) {}
323
459
  * [Equal.symbol](that: Equal.Equal): boolean {
324
- * return that instanceof MyClass
460
+ * return that instanceof Token && this.value === that.value
325
461
  * }
326
462
  * [Hash.symbol](): number {
327
- * return 0
463
+ * return Hash.string(this.value)
328
464
  * }
329
465
  * }
330
466
  *
331
- * const instance = new MyClass()
332
- * assert(Equal.isEqual(instance) === true)
333
- * assert(Equal.isEqual({}) === false)
334
- * assert(Equal.isEqual(42) === false)
467
+ * console.log(Equal.isEqual(new Token("abc"))) // true
468
+ * console.log(Equal.isEqual({ x: 1 })) // false
469
+ * console.log(Equal.isEqual(42)) // false
335
470
  * ```
336
471
  *
472
+ * @see {@link Equal} — the interface being checked
473
+ * @see {@link symbol} — the property key that signals `Equal` support
474
+ *
337
475
  * @category guards
338
476
  * @since 2.0.0
339
477
  */
340
478
  export const isEqual = (u: unknown): u is Equal => hasProperty(u, symbol)
341
479
 
342
480
  /**
343
- * Creates an `Equivalence` instance using the `equals` function.
344
- * This allows the equality logic to be used with APIs that expect an `Equivalence`.
481
+ * Wraps {@link equals} as an `Equivalence<A>`.
482
+ *
483
+ * When to use:
484
+ * - When an API (e.g. `Array.dedupeWith`, `Equivalence.mapInput`) requires an
485
+ * `Equivalence` and you want to reuse `Equal.equals`.
486
+ *
487
+ * Behavior:
488
+ * - Returns a function `(a: A, b: A) => boolean` that delegates to
489
+ * {@link equals}.
490
+ * - Pure; allocates a thin wrapper on each call.
491
+ *
492
+ * **Example** (deduplicating with Equal semantics)
345
493
  *
346
- * @example
347
494
  * ```ts
348
495
  * import { Array, Equal } from "effect"
349
496
  *
@@ -352,72 +499,92 @@ export const isEqual = (u: unknown): u is Equal => hasProperty(u, symbol)
352
499
  * console.log(result) // [1, 2, 3]
353
500
  * ```
354
501
  *
502
+ * @see {@link equals} — the underlying comparison function
503
+ *
355
504
  * @category instances
356
505
  * @since 2.0.0
357
506
  */
358
507
  export const asEquivalence: <A>() => Equivalence<A> = () => equals
359
508
 
360
509
  /**
361
- * Creates a proxy of an object that uses reference equality instead of structural equality.
510
+ * Creates a proxy that uses reference equality instead of structural equality.
362
511
  *
363
- * By default, plain objects and arrays use structural equality. This function creates
364
- * a proxy that behaves exactly like the original object but uses reference equality
365
- * for comparison purposes.
512
+ * When to use:
513
+ * - When you have a plain object or array that should be compared by identity
514
+ * (reference), not by contents.
515
+ * - When you want to preserve the original object unchanged and get a new
516
+ * reference-equal handle.
366
517
  *
367
- * @example
368
- * ```ts
369
- * import { Equal } from "effect"
370
- * import * as assert from "node:assert"
518
+ * Behavior:
519
+ * - Returns a `Proxy` wrapping `obj`. The proxy reads through to the
520
+ * original, so property access is unchanged.
521
+ * - The proxy is registered in an internal WeakSet; {@link equals} returns
522
+ * `false` for any pair where at least one operand is in that set (unless
523
+ * they are the same reference).
524
+ * - Each call creates a **new** proxy, so `byReference(x) !== byReference(x)`.
525
+ * - Does **not** mutate the original object (unlike {@link byReferenceUnsafe}).
371
526
  *
372
- * const obj1 = { a: 1, b: 2 }
373
- * const obj2 = { a: 1, b: 2 }
527
+ * **Example** (opting out of structural equality)
374
528
  *
375
- * // Normal structural equality
376
- * assert(Equal.equals(obj1, obj2) === true)
529
+ * ```ts
530
+ * import { Equal } from "effect"
377
531
  *
378
- * // Create reference equality version
379
- * const obj1ByRef = Equal.byReference(obj1)
380
- * assert(Equal.equals(obj1ByRef, obj2) === false) // uses reference equality
381
- * assert(Equal.equals(obj1ByRef, obj1ByRef) === true) // same reference
532
+ * const a = { x: 1 }
533
+ * const b = { x: 1 }
382
534
  *
383
- * // Each call creates a new proxy instance
384
- * const obj1ByRef2 = Equal.byReference(obj1)
385
- * assert(Equal.equals(obj1ByRef, obj1ByRef2) === false) // different instances
535
+ * console.log(Equal.equals(a, b)) // true (structural)
386
536
  *
387
- * // Proxy behaves like the original
388
- * assert(obj1ByRef.a === 1)
537
+ * const aRef = Equal.byReference(a)
538
+ * console.log(Equal.equals(aRef, b)) // false (reference)
539
+ * console.log(Equal.equals(aRef, aRef)) // true (same reference)
540
+ * console.log(aRef.x) // 1 (proxy reads through)
389
541
  * ```
390
542
  *
543
+ * @see {@link byReferenceUnsafe} — same effect without a proxy (mutates the
544
+ * original)
545
+ * @see {@link equals} — the comparison function affected by this opt-out
546
+ *
391
547
  * @category utility
392
548
  * @since 2.0.0
393
549
  */
394
550
  export const byReference = <T extends object>(obj: T): T => byReferenceUnsafe(new Proxy(obj, {}))
395
551
 
396
552
  /**
397
- * Marks an object to use reference equality instead of structural equality, without creating a proxy.
553
+ * Permanently marks an object to use reference equality, without creating a
554
+ * proxy.
398
555
  *
399
- * Unlike `byReference`, this function directly modifies the object's equality behavior
400
- * without creating a proxy wrapper. This is more performant but "unsafe" because
401
- * it permanently changes how the object is compared.
556
+ * When to use:
557
+ * - When you want reference equality semantics and can accept that the
558
+ * original object is **permanently** modified.
559
+ * - When proxy overhead is unacceptable (hot paths, large collections).
560
+ *
561
+ * Behavior:
562
+ * - Adds `obj` to an internal WeakSet. From that point on, {@link equals}
563
+ * treats it as reference-only.
564
+ * - Returns the **same** object (not a copy or proxy), so
565
+ * `byReferenceUnsafe(x) === x`.
566
+ * - The marking is irreversible for the lifetime of the object.
567
+ * - Does **not** affect the object's prototype, properties, or behavior
568
+ * beyond equality checks.
569
+ *
570
+ * **Example** (marking an object for reference equality)
402
571
  *
403
- * @example
404
572
  * ```ts
405
573
  * import { Equal } from "effect"
406
- * import * as assert from "node:assert"
407
574
  *
408
575
  * const obj1 = { a: 1, b: 2 }
409
576
  * const obj2 = { a: 1, b: 2 }
410
577
  *
411
- * // Mark obj1 for reference equality (modifies obj1 directly)
412
- * const obj1ByRef = Equal.byReferenceUnsafe(obj1)
413
- * assert(obj1ByRef === obj1) // Same object, no proxy created
414
- * assert(Equal.equals(obj1ByRef, obj2) === false) // uses reference equality
415
- * assert(Equal.equals(obj1ByRef, obj1ByRef) === true) // same reference
578
+ * Equal.byReferenceUnsafe(obj1)
416
579
  *
417
- * // The original obj1 is now permanently marked for reference equality
418
- * assert(Equal.equals(obj1, obj2) === false) // obj1 uses reference equality
580
+ * console.log(Equal.equals(obj1, obj2)) // false (reference)
581
+ * console.log(Equal.equals(obj1, obj1)) // true (same reference)
582
+ * console.log(obj1 === Equal.byReferenceUnsafe(obj1)) // true (same object)
419
583
  * ```
420
584
  *
585
+ * @see {@link byReference} — safer alternative that creates a proxy
586
+ * @see {@link equals} — the comparison function affected by this opt-out
587
+ *
421
588
  * @category utility
422
589
  * @since 2.0.0
423
590
  */
package/src/FileSystem.ts CHANGED
@@ -733,8 +733,7 @@ export const make = (
733
733
  Effect.as(true),
734
734
  Effect.catchTag(
735
735
  "PlatformError",
736
- (e) =>
737
- e.reason._tag === "SystemError" && e.reason.kind === "NotFound" ? Effect.succeed(false) : Effect.fail(e)
736
+ (e) => e.reason._tag === "NotFound" ? Effect.succeed(false) : Effect.fail(e)
738
737
  )
739
738
  ),
740
739
  readFileString: (path, encoding) =>
@@ -757,16 +756,16 @@ export const make = (
757
756
  const bytesToRead = options?.bytesToRead !== undefined ? Size(options.bytesToRead) : undefined
758
757
  let totalBytesRead = BigInt(0)
759
758
  const chunkSize = Size(options?.chunkSize ?? 64 * 1024)
759
+ const readChunk = file.readAlloc(chunkSize)
760
760
  return Stream.fromPull(Effect.succeed(
761
761
  Effect.flatMap(
762
762
  Effect.suspend((): Pull.Pull<Uint8Array | undefined, PlatformError> => {
763
763
  if (bytesToRead !== undefined && bytesToRead <= totalBytesRead) {
764
764
  return Cause.done()
765
765
  }
766
- const toRead = bytesToRead !== undefined && (bytesToRead - totalBytesRead) < chunkSize
767
- ? bytesToRead - totalBytesRead
768
- : chunkSize
769
- return file.readAlloc(toRead)
766
+ return bytesToRead !== undefined && (bytesToRead - totalBytesRead) < chunkSize
767
+ ? file.readAlloc(bytesToRead - totalBytesRead)
768
+ : readChunk
770
769
  }),
771
770
  (buf) => {
772
771
  if (!buf) return Cause.done()
@@ -802,7 +801,7 @@ const notFound = (method: string, path: string) =>
802
801
  systemError({
803
802
  module: "FileSystem",
804
803
  method,
805
- kind: "NotFound",
804
+ _tag: "NotFound",
806
805
  description: "No such file or directory",
807
806
  pathOrDescriptor: path
808
807
  })
@@ -829,9 +828,9 @@ const notFound = (method: string, path: string) =>
829
828
  * }
830
829
  * return Effect.fail(
831
830
  * PlatformError.systemError({
831
+ * _tag: "NotFound",
832
832
  * module: "FileSystem",
833
833
  * method: "readFileString",
834
- * kind: "NotFound",
835
834
  * description: "File not found",
836
835
  * pathOrDescriptor: path
837
836
  * })
package/src/Filter.ts CHANGED
@@ -7,7 +7,7 @@ import { dual } from "./Function.ts"
7
7
  import * as Option from "./Option.ts"
8
8
  import * as Predicate from "./Predicate.ts"
9
9
  import * as Result from "./Result.ts"
10
- import type { EqualsWith, ExcludeTag, ExtractTag, Tags } from "./Types.ts"
10
+ import type { EqualsWith, ExcludeTag, ExtractReason, ExtractTag, ReasonTags, Tags } from "./Types.ts"
11
11
 
12
12
  /**
13
13
  * Represents a filter function that can transform inputs to outputs or filter them out.
@@ -456,6 +456,53 @@ const taggedImpl =
456
456
  <Input>(input: Input): Result.Result<ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>> =>
457
457
  Predicate.isTagged(input, tag) ? Result.succeed(input as any) : Result.fail(input as ExcludeTag<Input, Tag>)
458
458
 
459
+ /**
460
+ * Creates a filter that extracts a reason from a tagged error.
461
+ *
462
+ * @since 4.0.0
463
+ * @category Constructors
464
+ */
465
+ export const reason: {
466
+ /**
467
+ * Creates a filter that extracts a reason from a tagged error.
468
+ *
469
+ * @since 4.0.0
470
+ * @category Constructors
471
+ */
472
+ <Input>(): <const Tag extends Tags<Input>, const ReasonTag extends ReasonTags<ExtractTag<Input, Tag>>>(
473
+ tag: Tag,
474
+ reasonTag: ReasonTag
475
+ ) => Filter<Input, ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input>
476
+ /**
477
+ * Creates a filter that extracts a reason from a tagged error.
478
+ *
479
+ * @since 4.0.0
480
+ * @category Constructors
481
+ */
482
+ <Input, const Tag extends Tags<Input>, const ReasonTag extends ReasonTags<ExtractTag<Input, Tag>>>(tag: Tag, reasonTag: ReasonTag): Filter<Input, ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input>
483
+ /**
484
+ * Creates a filter that extracts a reason from a tagged error.
485
+ *
486
+ * @since 4.0.0
487
+ * @category Constructors
488
+ */
489
+ <const Tag extends string, const ReasonTag extends string>(tag: Tag, reasonTag: ReasonTag): <Input>(input: Input) => Result.Result<ExtractReason<ExtractTag<Input, Tag>, ReasonTag>, Input>
490
+ } = function() {
491
+ return arguments.length === 0 ? reasonImpl : reasonImpl(arguments[0] as any, arguments[1] as any)
492
+ } as any
493
+
494
+ const reasonImpl =
495
+ <const Tag extends string, const ReasonTag extends string>(tag: Tag, reasonTag: ReasonTag) =>
496
+ <Input>(input: Input): Result.Result<ExtractTag<Input, Tag>, ExcludeTag<Input, Tag>> => {
497
+ if (
498
+ Predicate.isTagged(input, tag) && Predicate.hasProperty(input, "reason") &&
499
+ Predicate.isTagged(input.reason, reasonTag)
500
+ ) {
501
+ return Result.succeed(input.reason as any)
502
+ }
503
+ return Result.fail(input as any)
504
+ }
505
+
459
506
  /**
460
507
  * Creates a filter that only passes values equal to the specified value using structural equality.
461
508
  *