effect 4.0.0-beta.31 → 4.0.0-beta.32

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 (464) hide show
  1. package/dist/Array.d.ts +87 -86
  2. package/dist/Array.d.ts.map +1 -1
  3. package/dist/Array.js +47 -40
  4. package/dist/Array.js.map +1 -1
  5. package/dist/BigDecimal.d.ts +46 -45
  6. package/dist/BigDecimal.d.ts.map +1 -1
  7. package/dist/BigDecimal.js +35 -38
  8. package/dist/BigDecimal.js.map +1 -1
  9. package/dist/BigInt.d.ts +39 -32
  10. package/dist/BigInt.d.ts.map +1 -1
  11. package/dist/BigInt.js +32 -29
  12. package/dist/BigInt.js.map +1 -1
  13. package/dist/Chunk.d.ts +58 -57
  14. package/dist/Chunk.d.ts.map +1 -1
  15. package/dist/Chunk.js +20 -21
  16. package/dist/Chunk.js.map +1 -1
  17. package/dist/Config.d.ts.map +1 -1
  18. package/dist/Config.js +4 -1
  19. package/dist/Config.js.map +1 -1
  20. package/dist/Cron.d.ts +3 -6
  21. package/dist/Cron.d.ts.map +1 -1
  22. package/dist/Cron.js +8 -15
  23. package/dist/Cron.js.map +1 -1
  24. package/dist/DateTime.d.ts +16 -15
  25. package/dist/DateTime.d.ts.map +1 -1
  26. package/dist/DateTime.js +8 -8
  27. package/dist/DateTime.js.map +1 -1
  28. package/dist/Deferred.d.ts +7 -5
  29. package/dist/Deferred.d.ts.map +1 -1
  30. package/dist/Deferred.js +7 -5
  31. package/dist/Deferred.js.map +1 -1
  32. package/dist/Duration.d.ts +26 -24
  33. package/dist/Duration.d.ts.map +1 -1
  34. package/dist/Duration.js +23 -22
  35. package/dist/Duration.js.map +1 -1
  36. package/dist/Effect.d.ts.map +1 -1
  37. package/dist/Effect.js +3 -4
  38. package/dist/Effect.js.map +1 -1
  39. package/dist/Fiber.d.ts +2 -1
  40. package/dist/Fiber.d.ts.map +1 -1
  41. package/dist/Fiber.js.map +1 -1
  42. package/dist/FiberHandle.d.ts +9 -8
  43. package/dist/FiberHandle.d.ts.map +1 -1
  44. package/dist/FiberHandle.js +8 -7
  45. package/dist/FiberHandle.js.map +1 -1
  46. package/dist/FiberMap.d.ts +20 -19
  47. package/dist/FiberMap.d.ts.map +1 -1
  48. package/dist/FiberMap.js +6 -6
  49. package/dist/FiberMap.js.map +1 -1
  50. package/dist/FileSystem.d.ts +17 -16
  51. package/dist/FileSystem.d.ts.map +1 -1
  52. package/dist/FileSystem.js +10 -7
  53. package/dist/FileSystem.js.map +1 -1
  54. package/dist/Graph.d.ts +64 -64
  55. package/dist/Graph.d.ts.map +1 -1
  56. package/dist/Graph.js +53 -53
  57. package/dist/Graph.js.map +1 -1
  58. package/dist/HashMap.d.ts +11 -5
  59. package/dist/HashMap.d.ts.map +1 -1
  60. package/dist/HashMap.js +3 -1
  61. package/dist/HashMap.js.map +1 -1
  62. package/dist/Iterable.d.ts +11 -11
  63. package/dist/Iterable.d.ts.map +1 -1
  64. package/dist/Iterable.js +12 -12
  65. package/dist/Iterable.js.map +1 -1
  66. package/dist/Latch.d.ts +69 -3
  67. package/dist/Latch.d.ts.map +1 -1
  68. package/dist/Latch.js +58 -0
  69. package/dist/Latch.js.map +1 -1
  70. package/dist/Layer.d.ts +84 -0
  71. package/dist/Layer.d.ts.map +1 -1
  72. package/dist/Layer.js +27 -0
  73. package/dist/Layer.js.map +1 -1
  74. package/dist/Number.d.ts +74 -18
  75. package/dist/Number.d.ts.map +1 -1
  76. package/dist/Number.js +34 -15
  77. package/dist/Number.js.map +1 -1
  78. package/dist/Option.d.ts +2 -0
  79. package/dist/Option.d.ts.map +1 -1
  80. package/dist/Option.js.map +1 -1
  81. package/dist/PartitionedSemaphore.d.ts +183 -0
  82. package/dist/PartitionedSemaphore.d.ts.map +1 -0
  83. package/dist/PartitionedSemaphore.js +231 -0
  84. package/dist/PartitionedSemaphore.js.map +1 -0
  85. package/dist/PubSub.d.ts +5 -4
  86. package/dist/PubSub.d.ts.map +1 -1
  87. package/dist/PubSub.js +6 -5
  88. package/dist/PubSub.js.map +1 -1
  89. package/dist/Queue.d.ts +3 -3
  90. package/dist/Queue.d.ts.map +1 -1
  91. package/dist/Queue.js +2 -2
  92. package/dist/Queue.js.map +1 -1
  93. package/dist/Record.d.ts +40 -40
  94. package/dist/Record.d.ts.map +1 -1
  95. package/dist/Record.js +16 -15
  96. package/dist/Record.js.map +1 -1
  97. package/dist/Scheduler.d.ts +25 -123
  98. package/dist/Scheduler.d.ts.map +1 -1
  99. package/dist/Scheduler.js +20 -123
  100. package/dist/Scheduler.js.map +1 -1
  101. package/dist/Schema.d.ts +30 -0
  102. package/dist/Schema.d.ts.map +1 -1
  103. package/dist/Schema.js +28 -1
  104. package/dist/Schema.js.map +1 -1
  105. package/dist/SchemaGetter.js +6 -4
  106. package/dist/SchemaGetter.js.map +1 -1
  107. package/dist/SchemaTransformation.d.ts.map +1 -1
  108. package/dist/SchemaTransformation.js +32 -27
  109. package/dist/SchemaTransformation.js.map +1 -1
  110. package/dist/Semaphore.d.ts +149 -53
  111. package/dist/Semaphore.d.ts.map +1 -1
  112. package/dist/Semaphore.js +137 -117
  113. package/dist/Semaphore.js.map +1 -1
  114. package/dist/ServiceMap.d.ts +26 -0
  115. package/dist/ServiceMap.d.ts.map +1 -1
  116. package/dist/ServiceMap.js +36 -21
  117. package/dist/ServiceMap.js.map +1 -1
  118. package/dist/Stream.js +1 -1
  119. package/dist/Stream.js.map +1 -1
  120. package/dist/String.d.ts +114 -47
  121. package/dist/String.d.ts.map +1 -1
  122. package/dist/String.js +29 -47
  123. package/dist/String.js.map +1 -1
  124. package/dist/SubscriptionRef.d.ts +1 -2
  125. package/dist/SubscriptionRef.d.ts.map +1 -1
  126. package/dist/SubscriptionRef.js +81 -115
  127. package/dist/SubscriptionRef.js.map +1 -1
  128. package/dist/Terminal.d.ts +2 -1
  129. package/dist/Terminal.d.ts.map +1 -1
  130. package/dist/Terminal.js.map +1 -1
  131. package/dist/Tracer.d.ts +5 -4
  132. package/dist/Tracer.d.ts.map +1 -1
  133. package/dist/Tracer.js +2 -1
  134. package/dist/Tracer.js.map +1 -1
  135. package/dist/Trie.d.ts +26 -14
  136. package/dist/Trie.d.ts.map +1 -1
  137. package/dist/Trie.js +8 -4
  138. package/dist/Trie.js.map +1 -1
  139. package/dist/TxHashMap.d.ts +77 -59
  140. package/dist/TxHashMap.d.ts.map +1 -1
  141. package/dist/TxHashMap.js +25 -19
  142. package/dist/TxHashMap.js.map +1 -1
  143. package/dist/TxSemaphore.d.ts +162 -2
  144. package/dist/TxSemaphore.d.ts.map +1 -1
  145. package/dist/TxSemaphore.js +16 -2
  146. package/dist/TxSemaphore.js.map +1 -1
  147. package/dist/index.d.ts +88 -32
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +88 -32
  150. package/dist/index.js.map +1 -1
  151. package/dist/internal/dateTime.js +9 -9
  152. package/dist/internal/dateTime.js.map +1 -1
  153. package/dist/internal/effect.js +20 -89
  154. package/dist/internal/effect.js.map +1 -1
  155. package/dist/internal/hashMap.js +2 -1
  156. package/dist/internal/hashMap.js.map +1 -1
  157. package/dist/internal/option.js +6 -0
  158. package/dist/internal/option.js.map +1 -1
  159. package/dist/internal/trie.js +3 -3
  160. package/dist/internal/trie.js.map +1 -1
  161. package/dist/unstable/ai/AiError.js +1 -1
  162. package/dist/unstable/ai/AiError.js.map +1 -1
  163. package/dist/unstable/ai/AnthropicStructuredOutput.d.ts.map +1 -1
  164. package/dist/unstable/ai/AnthropicStructuredOutput.js +4 -0
  165. package/dist/unstable/ai/AnthropicStructuredOutput.js.map +1 -1
  166. package/dist/unstable/ai/Chat.d.ts.map +1 -1
  167. package/dist/unstable/ai/Chat.js +2 -2
  168. package/dist/unstable/ai/Chat.js.map +1 -1
  169. package/dist/unstable/ai/OpenAiStructuredOutput.d.ts.map +1 -1
  170. package/dist/unstable/ai/OpenAiStructuredOutput.js +4 -0
  171. package/dist/unstable/ai/OpenAiStructuredOutput.js.map +1 -1
  172. package/dist/unstable/ai/Tool.d.ts +14 -0
  173. package/dist/unstable/ai/Tool.d.ts.map +1 -1
  174. package/dist/unstable/ai/Tool.js +13 -0
  175. package/dist/unstable/ai/Tool.js.map +1 -1
  176. package/dist/unstable/cli/Argument.d.ts +2 -4
  177. package/dist/unstable/cli/Argument.d.ts.map +1 -1
  178. package/dist/unstable/cli/Argument.js +1 -3
  179. package/dist/unstable/cli/Argument.js.map +1 -1
  180. package/dist/unstable/cli/CliOutput.d.ts +3 -2
  181. package/dist/unstable/cli/CliOutput.d.ts.map +1 -1
  182. package/dist/unstable/cli/CliOutput.js +4 -3
  183. package/dist/unstable/cli/CliOutput.js.map +1 -1
  184. package/dist/unstable/cli/Command.d.ts +3 -2
  185. package/dist/unstable/cli/Command.d.ts.map +1 -1
  186. package/dist/unstable/cli/Command.js +3 -3
  187. package/dist/unstable/cli/Command.js.map +1 -1
  188. package/dist/unstable/cli/Flag.d.ts +2 -2
  189. package/dist/unstable/cli/Flag.d.ts.map +1 -1
  190. package/dist/unstable/cli/Flag.js +1 -1
  191. package/dist/unstable/cli/Flag.js.map +1 -1
  192. package/dist/unstable/cli/HelpDoc.d.ts +14 -12
  193. package/dist/unstable/cli/HelpDoc.d.ts.map +1 -1
  194. package/dist/unstable/cli/Param.d.ts +4 -4
  195. package/dist/unstable/cli/Param.d.ts.map +1 -1
  196. package/dist/unstable/cli/Param.js +7 -7
  197. package/dist/unstable/cli/Param.js.map +1 -1
  198. package/dist/unstable/cli/Primitive.d.ts +1 -1
  199. package/dist/unstable/cli/Primitive.d.ts.map +1 -1
  200. package/dist/unstable/cli/Primitive.js.map +1 -1
  201. package/dist/unstable/cli/Prompt.js +71 -67
  202. package/dist/unstable/cli/Prompt.js.map +1 -1
  203. package/dist/unstable/cli/internal/completions/CommandDescriptor.js +9 -2
  204. package/dist/unstable/cli/internal/completions/CommandDescriptor.js.map +1 -1
  205. package/dist/unstable/cli/internal/parser.js +8 -3
  206. package/dist/unstable/cli/internal/parser.js.map +1 -1
  207. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts +3 -2
  208. package/dist/unstable/cluster/ClusterWorkflowEngine.d.ts.map +1 -1
  209. package/dist/unstable/cluster/ClusterWorkflowEngine.js +25 -23
  210. package/dist/unstable/cluster/ClusterWorkflowEngine.js.map +1 -1
  211. package/dist/unstable/cluster/Entity.d.ts +3 -2
  212. package/dist/unstable/cluster/Entity.d.ts.map +1 -1
  213. package/dist/unstable/cluster/Entity.js +7 -7
  214. package/dist/unstable/cluster/Entity.js.map +1 -1
  215. package/dist/unstable/cluster/Message.d.ts +4 -3
  216. package/dist/unstable/cluster/Message.d.ts.map +1 -1
  217. package/dist/unstable/cluster/Message.js +3 -2
  218. package/dist/unstable/cluster/Message.js.map +1 -1
  219. package/dist/unstable/cluster/MessageStorage.d.ts +10 -10
  220. package/dist/unstable/cluster/MessageStorage.d.ts.map +1 -1
  221. package/dist/unstable/cluster/MessageStorage.js +12 -12
  222. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  223. package/dist/unstable/cluster/Reply.d.ts +2 -1
  224. package/dist/unstable/cluster/Reply.d.ts.map +1 -1
  225. package/dist/unstable/cluster/Reply.js +4 -3
  226. package/dist/unstable/cluster/Reply.js.map +1 -1
  227. package/dist/unstable/cluster/RunnerServer.d.ts.map +1 -1
  228. package/dist/unstable/cluster/RunnerServer.js +9 -8
  229. package/dist/unstable/cluster/RunnerServer.js.map +1 -1
  230. package/dist/unstable/cluster/Runners.d.ts +2 -1
  231. package/dist/unstable/cluster/Runners.d.ts.map +1 -1
  232. package/dist/unstable/cluster/Runners.js +7 -6
  233. package/dist/unstable/cluster/Runners.js.map +1 -1
  234. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  235. package/dist/unstable/cluster/Sharding.js +19 -13
  236. package/dist/unstable/cluster/Sharding.js.map +1 -1
  237. package/dist/unstable/cluster/ShardingConfig.d.ts +5 -4
  238. package/dist/unstable/cluster/ShardingConfig.d.ts.map +1 -1
  239. package/dist/unstable/cluster/ShardingConfig.js +4 -4
  240. package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
  241. package/dist/unstable/cluster/SqlMessageStorage.d.ts.map +1 -1
  242. package/dist/unstable/cluster/SqlMessageStorage.js +19 -18
  243. package/dist/unstable/cluster/SqlMessageStorage.js.map +1 -1
  244. package/dist/unstable/cluster/internal/entityManager.js +9 -10
  245. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  246. package/dist/unstable/devtools/DevToolsSchema.d.ts +2 -1
  247. package/dist/unstable/devtools/DevToolsSchema.d.ts.map +1 -1
  248. package/dist/unstable/devtools/DevToolsSchema.js +1 -4
  249. package/dist/unstable/devtools/DevToolsSchema.js.map +1 -1
  250. package/dist/unstable/http/Cookies.d.ts +5 -4
  251. package/dist/unstable/http/Cookies.d.ts.map +1 -1
  252. package/dist/unstable/http/Cookies.js +3 -4
  253. package/dist/unstable/http/Cookies.js.map +1 -1
  254. package/dist/unstable/http/Etag.d.ts.map +1 -1
  255. package/dist/unstable/http/Etag.js +5 -1
  256. package/dist/unstable/http/Etag.js.map +1 -1
  257. package/dist/unstable/http/Headers.d.ts +3 -2
  258. package/dist/unstable/http/Headers.d.ts.map +1 -1
  259. package/dist/unstable/http/Headers.js +2 -1
  260. package/dist/unstable/http/Headers.js.map +1 -1
  261. package/dist/unstable/http/HttpClient.d.ts.map +1 -1
  262. package/dist/unstable/http/HttpClient.js +2 -1
  263. package/dist/unstable/http/HttpClient.js.map +1 -1
  264. package/dist/unstable/http/HttpClientRequest.d.ts +4 -3
  265. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  266. package/dist/unstable/http/HttpClientRequest.js +8 -6
  267. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  268. package/dist/unstable/http/HttpClientResponse.d.ts.map +1 -1
  269. package/dist/unstable/http/HttpClientResponse.js +2 -1
  270. package/dist/unstable/http/HttpClientResponse.js.map +1 -1
  271. package/dist/unstable/http/HttpIncomingMessage.d.ts +2 -1
  272. package/dist/unstable/http/HttpIncomingMessage.d.ts.map +1 -1
  273. package/dist/unstable/http/HttpIncomingMessage.js.map +1 -1
  274. package/dist/unstable/http/HttpMiddleware.d.ts.map +1 -1
  275. package/dist/unstable/http/HttpMiddleware.js +16 -15
  276. package/dist/unstable/http/HttpMiddleware.js.map +1 -1
  277. package/dist/unstable/http/HttpPlatform.d.ts.map +1 -1
  278. package/dist/unstable/http/HttpPlatform.js +3 -2
  279. package/dist/unstable/http/HttpPlatform.js.map +1 -1
  280. package/dist/unstable/http/HttpRouter.d.ts +2 -1
  281. package/dist/unstable/http/HttpRouter.d.ts.map +1 -1
  282. package/dist/unstable/http/HttpRouter.js +7 -7
  283. package/dist/unstable/http/HttpRouter.js.map +1 -1
  284. package/dist/unstable/http/HttpServer.d.ts.map +1 -1
  285. package/dist/unstable/http/HttpServer.js +2 -2
  286. package/dist/unstable/http/HttpServer.js.map +1 -1
  287. package/dist/unstable/http/HttpServerError.d.ts +2 -1
  288. package/dist/unstable/http/HttpServerError.d.ts.map +1 -1
  289. package/dist/unstable/http/HttpServerError.js +2 -1
  290. package/dist/unstable/http/HttpServerError.js.map +1 -1
  291. package/dist/unstable/http/HttpServerRequest.d.ts +3 -2
  292. package/dist/unstable/http/HttpServerRequest.d.ts.map +1 -1
  293. package/dist/unstable/http/HttpServerRequest.js +14 -10
  294. package/dist/unstable/http/HttpServerRequest.js.map +1 -1
  295. package/dist/unstable/http/HttpServerResponse.d.ts.map +1 -1
  296. package/dist/unstable/http/HttpServerResponse.js +4 -3
  297. package/dist/unstable/http/HttpServerResponse.js.map +1 -1
  298. package/dist/unstable/http/HttpTraceContext.d.ts +3 -2
  299. package/dist/unstable/http/HttpTraceContext.d.ts.map +1 -1
  300. package/dist/unstable/http/HttpTraceContext.js +27 -15
  301. package/dist/unstable/http/HttpTraceContext.js.map +1 -1
  302. package/dist/unstable/http/UrlParams.d.ts +5 -4
  303. package/dist/unstable/http/UrlParams.d.ts.map +1 -1
  304. package/dist/unstable/http/UrlParams.js +5 -6
  305. package/dist/unstable/http/UrlParams.js.map +1 -1
  306. package/dist/unstable/httpapi/HttpApiBuilder.d.ts.map +1 -1
  307. package/dist/unstable/httpapi/HttpApiBuilder.js +4 -2
  308. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  309. package/dist/unstable/httpapi/HttpApiError.d.ts +15 -0
  310. package/dist/unstable/httpapi/HttpApiError.d.ts.map +1 -1
  311. package/dist/unstable/httpapi/HttpApiError.js +81 -3
  312. package/dist/unstable/httpapi/HttpApiError.js.map +1 -1
  313. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  314. package/dist/unstable/observability/OtlpExporter.js +2 -2
  315. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  316. package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
  317. package/dist/unstable/observability/OtlpTracer.js +7 -3
  318. package/dist/unstable/observability/OtlpTracer.js.map +1 -1
  319. package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
  320. package/dist/unstable/reactivity/Atom.js +1 -5
  321. package/dist/unstable/reactivity/Atom.js.map +1 -1
  322. package/dist/unstable/reactivity/AtomRegistry.d.ts.map +1 -1
  323. package/dist/unstable/reactivity/AtomRegistry.js +4 -2
  324. package/dist/unstable/reactivity/AtomRegistry.js.map +1 -1
  325. package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
  326. package/dist/unstable/rpc/Rpc.js +4 -3
  327. package/dist/unstable/rpc/Rpc.js.map +1 -1
  328. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  329. package/dist/unstable/rpc/RpcClient.js +4 -4
  330. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  331. package/dist/unstable/rpc/RpcSchema.d.ts.map +1 -1
  332. package/dist/unstable/rpc/RpcSchema.js +3 -2
  333. package/dist/unstable/rpc/RpcSchema.js.map +1 -1
  334. package/dist/unstable/rpc/RpcSerialization.d.ts.map +1 -1
  335. package/dist/unstable/rpc/RpcSerialization.js +4 -1
  336. package/dist/unstable/rpc/RpcSerialization.js.map +1 -1
  337. package/dist/unstable/rpc/RpcServer.d.ts +1 -1
  338. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  339. package/dist/unstable/rpc/RpcServer.js +3 -2
  340. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  341. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  342. package/dist/unstable/socket/Socket.js +2 -1
  343. package/dist/unstable/socket/Socket.js.map +1 -1
  344. package/dist/unstable/sql/SqlClient.d.ts.map +1 -1
  345. package/dist/unstable/sql/SqlClient.js +1 -1
  346. package/dist/unstable/sql/SqlClient.js.map +1 -1
  347. package/dist/unstable/workflow/DurableDeferred.js +6 -6
  348. package/dist/unstable/workflow/DurableDeferred.js.map +1 -1
  349. package/dist/unstable/workflow/Workflow.d.ts +2 -1
  350. package/dist/unstable/workflow/Workflow.d.ts.map +1 -1
  351. package/dist/unstable/workflow/WorkflowEngine.d.ts +5 -4
  352. package/dist/unstable/workflow/WorkflowEngine.d.ts.map +1 -1
  353. package/dist/unstable/workflow/WorkflowEngine.js +19 -14
  354. package/dist/unstable/workflow/WorkflowEngine.js.map +1 -1
  355. package/package.json +1 -1
  356. package/src/Array.ts +112 -105
  357. package/src/BigDecimal.ts +63 -66
  358. package/src/BigInt.ts +49 -41
  359. package/src/Chunk.ts +68 -63
  360. package/src/Config.ts +4 -1
  361. package/src/Cron.ts +10 -15
  362. package/src/DateTime.ts +16 -15
  363. package/src/Deferred.ts +8 -6
  364. package/src/Duration.ts +34 -33
  365. package/src/Effect.ts +3 -4
  366. package/src/Fiber.ts +2 -1
  367. package/src/FiberHandle.ts +10 -9
  368. package/src/FiberMap.ts +22 -22
  369. package/src/FileSystem.ts +25 -22
  370. package/src/Graph.ts +105 -105
  371. package/src/HashMap.ts +11 -5
  372. package/src/Iterable.ts +13 -13
  373. package/src/Latch.ts +85 -3
  374. package/src/Layer.ts +121 -0
  375. package/src/Number.ts +85 -26
  376. package/src/Option.ts +2 -0
  377. package/src/PartitionedSemaphore.ts +414 -0
  378. package/src/PubSub.ts +7 -6
  379. package/src/Queue.ts +5 -5
  380. package/src/Record.ts +52 -47
  381. package/src/Scheduler.ts +37 -126
  382. package/src/Schema.ts +49 -1
  383. package/src/SchemaGetter.ts +4 -4
  384. package/src/SchemaTransformation.ts +27 -27
  385. package/src/Semaphore.ts +271 -183
  386. package/src/ServiceMap.ts +83 -31
  387. package/src/Stream.ts +1 -1
  388. package/src/String.ts +122 -69
  389. package/src/SubscriptionRef.ts +96 -117
  390. package/src/Terminal.ts +2 -1
  391. package/src/Tracer.ts +6 -5
  392. package/src/Trie.ts +26 -14
  393. package/src/TxHashMap.ts +78 -60
  394. package/src/TxSemaphore.ts +186 -11
  395. package/src/index.ts +89 -33
  396. package/src/internal/dateTime.ts +14 -14
  397. package/src/internal/effect.ts +29 -121
  398. package/src/internal/hashMap.ts +4 -3
  399. package/src/internal/option.ts +7 -0
  400. package/src/internal/trie.ts +6 -6
  401. package/src/unstable/ai/AiError.ts +1 -1
  402. package/src/unstable/ai/AnthropicStructuredOutput.ts +4 -0
  403. package/src/unstable/ai/Chat.ts +6 -2
  404. package/src/unstable/ai/OpenAiStructuredOutput.ts +4 -0
  405. package/src/unstable/ai/Tool.ts +20 -0
  406. package/src/unstable/cli/Argument.ts +2 -4
  407. package/src/unstable/cli/CliOutput.ts +7 -5
  408. package/src/unstable/cli/Command.ts +5 -5
  409. package/src/unstable/cli/Flag.ts +2 -2
  410. package/src/unstable/cli/HelpDoc.ts +14 -12
  411. package/src/unstable/cli/Param.ts +15 -11
  412. package/src/unstable/cli/Primitive.ts +1 -1
  413. package/src/unstable/cli/Prompt.ts +81 -83
  414. package/src/unstable/cli/internal/completions/CommandDescriptor.ts +3 -2
  415. package/src/unstable/cli/internal/parser.ts +7 -4
  416. package/src/unstable/cluster/ClusterWorkflowEngine.ts +35 -30
  417. package/src/unstable/cluster/Entity.ts +13 -12
  418. package/src/unstable/cluster/Message.ts +6 -5
  419. package/src/unstable/cluster/MessageStorage.ts +26 -25
  420. package/src/unstable/cluster/Reply.ts +7 -4
  421. package/src/unstable/cluster/RunnerServer.ts +10 -13
  422. package/src/unstable/cluster/Runners.ts +8 -7
  423. package/src/unstable/cluster/Sharding.ts +24 -17
  424. package/src/unstable/cluster/ShardingConfig.ts +6 -6
  425. package/src/unstable/cluster/SqlMessageStorage.ts +21 -18
  426. package/src/unstable/cluster/internal/entityManager.ts +27 -21
  427. package/src/unstable/devtools/DevToolsSchema.ts +3 -2
  428. package/src/unstable/http/Cookies.ts +7 -8
  429. package/src/unstable/http/Etag.ts +5 -3
  430. package/src/unstable/http/Headers.ts +6 -5
  431. package/src/unstable/http/HttpClient.ts +2 -1
  432. package/src/unstable/http/HttpClientRequest.ts +11 -9
  433. package/src/unstable/http/HttpClientResponse.ts +3 -2
  434. package/src/unstable/http/HttpIncomingMessage.ts +2 -1
  435. package/src/unstable/http/HttpMiddleware.ts +16 -15
  436. package/src/unstable/http/HttpPlatform.ts +3 -2
  437. package/src/unstable/http/HttpRouter.ts +9 -9
  438. package/src/unstable/http/HttpServer.ts +3 -9
  439. package/src/unstable/http/HttpServerError.ts +3 -2
  440. package/src/unstable/http/HttpServerRequest.ts +25 -21
  441. package/src/unstable/http/HttpServerResponse.ts +5 -4
  442. package/src/unstable/http/HttpTraceContext.ts +31 -17
  443. package/src/unstable/http/UrlParams.ts +11 -14
  444. package/src/unstable/httpapi/HttpApiBuilder.ts +9 -3
  445. package/src/unstable/httpapi/HttpApiError.ts +67 -12
  446. package/src/unstable/observability/OtlpExporter.ts +5 -2
  447. package/src/unstable/observability/OtlpTracer.ts +8 -4
  448. package/src/unstable/reactivity/Atom.ts +1 -4
  449. package/src/unstable/reactivity/AtomRegistry.ts +5 -3
  450. package/src/unstable/rpc/Rpc.ts +4 -3
  451. package/src/unstable/rpc/RpcClient.ts +10 -9
  452. package/src/unstable/rpc/RpcSchema.ts +6 -5
  453. package/src/unstable/rpc/RpcSerialization.ts +4 -1
  454. package/src/unstable/rpc/RpcServer.ts +3 -3
  455. package/src/unstable/socket/Socket.ts +2 -1
  456. package/src/unstable/sql/SqlClient.ts +5 -3
  457. package/src/unstable/workflow/DurableDeferred.ts +6 -6
  458. package/src/unstable/workflow/Workflow.ts +1 -1
  459. package/src/unstable/workflow/WorkflowEngine.ts +29 -20
  460. package/dist/NullOr.d.ts +0 -149
  461. package/dist/NullOr.d.ts.map +0 -1
  462. package/dist/NullOr.js +0 -152
  463. package/dist/NullOr.js.map +0 -1
  464. package/src/NullOr.ts +0 -204
package/src/Semaphore.ts CHANGED
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * @since 2.0.0
3
3
  */
4
- import * as Effect from "./Effect.ts"
4
+ import type * as Effect from "./Effect.ts"
5
+ import type { Fiber } from "./Fiber.ts"
6
+ import { dual } from "./Function.ts"
7
+ import * as core from "./internal/core.ts"
5
8
  import * as internal from "./internal/effect.ts"
6
- import * as MutableHashMap from "./MutableHashMap.ts"
7
- import * as Option from "./Option.ts"
9
+ import type * as Option from "./Option.ts"
8
10
 
9
11
  /**
10
12
  * @category models
@@ -27,7 +29,7 @@ export interface Semaphore {
27
29
  /**
28
30
  * Adjusts the number of permits available in the semaphore.
29
31
  */
30
- resize(permits: number): Effect.Effect<void>
32
+ resize(this: Semaphore, permits: number): Effect.Effect<void>
31
33
 
32
34
  /**
33
35
  * Runs an effect with the given number of permits and releases the permits
@@ -40,7 +42,7 @@ export interface Semaphore {
40
42
  * If insufficient permits are available, the function will wait until they
41
43
  * are released by other tasks.
42
44
  */
43
- withPermits(permits: number): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
45
+ withPermits(this: Semaphore, permits: number): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
44
46
 
45
47
  /**
46
48
  * Runs an effect with the given number of permits and releases the permits
@@ -53,7 +55,7 @@ export interface Semaphore {
53
55
  * If insufficient permits are available, the function will wait until they
54
56
  * are released by other tasks.
55
57
  */
56
- withPermit<A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>
58
+ withPermit<A, E, R>(this: Semaphore, self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>
57
59
 
58
60
  /**
59
61
  * Runs an effect only if the specified number of permits are immediately
@@ -67,6 +69,7 @@ export interface Semaphore {
67
69
  * the result is `Option.none`.
68
70
  */
69
71
  withPermitsIfAvailable(
72
+ this: Semaphore,
70
73
  permits: number
71
74
  ): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>
72
75
 
@@ -75,18 +78,18 @@ export interface Semaphore {
75
78
  * available permits, suspending the task if they are not yet available.
76
79
  * Concurrent pending `take` calls are processed in a first-in, first-out manner.
77
80
  */
78
- take(permits: number): Effect.Effect<number>
81
+ take(this: Semaphore, permits: number): Effect.Effect<number>
79
82
 
80
83
  /**
81
84
  * Releases the specified number of permits and returns the resulting
82
85
  * available permits.
83
86
  */
84
- release(permits: number): Effect.Effect<number>
87
+ release(this: Semaphore, permits: number): Effect.Effect<number>
85
88
 
86
89
  /**
87
90
  * Releases all permits held by this semaphore and returns the resulting available permits.
88
91
  */
89
- releaseAll: Effect.Effect<number>
92
+ readonly releaseAll: Effect.Effect<number>
90
93
  }
91
94
 
92
95
  /**
@@ -126,7 +129,113 @@ export interface Semaphore {
126
129
  * @since 2.0.0
127
130
  * @category constructors
128
131
  */
129
- export const makeUnsafe: (permits: number) => Semaphore = internal.makeSemaphoreUnsafe
132
+ export const makeUnsafe = (permits: number): Semaphore => new SemaphoreImpl(permits)
133
+
134
+ class SemaphoreImpl implements Semaphore {
135
+ public waiters = new Set<() => void>()
136
+ public taken = 0
137
+ public permits: number
138
+
139
+ constructor(permits: number) {
140
+ this.permits = permits
141
+ }
142
+
143
+ get free() {
144
+ return this.permits - this.taken
145
+ }
146
+
147
+ take(n: number): Effect.Effect<number> {
148
+ const take: Effect.Effect<number> = internal.suspend(() => {
149
+ if (this.free < n) {
150
+ return internal.callback((resume) => {
151
+ if (this.free >= n) return resume(take)
152
+ const observer = () => {
153
+ if (this.free < n) return
154
+ this.waiters.delete(observer)
155
+ resume(take)
156
+ }
157
+ this.waiters.add(observer)
158
+ return internal.sync(() => {
159
+ this.waiters.delete(observer)
160
+ })
161
+ })
162
+ }
163
+ this.taken += n
164
+ return internal.succeed(n)
165
+ })
166
+ return take
167
+ }
168
+
169
+ updateTakenUnsafe(fiber: Fiber<any, any>, f: (n: number) => number): number {
170
+ this.taken = f(this.taken)
171
+ if (this.waiters.size > 0) {
172
+ fiber.currentDispatcher.scheduleTask(() => {
173
+ const iter = this.waiters.values()
174
+ let item = iter.next()
175
+ while (item.done === false && this.free > 0) {
176
+ item.value()
177
+ item = iter.next()
178
+ }
179
+ }, 0)
180
+ }
181
+ return this.free
182
+ }
183
+
184
+ updateTaken(f: (n: number) => number): Effect.Effect<number> {
185
+ return core.withFiber((fiber) => internal.succeed(this.updateTakenUnsafe(fiber, f)))
186
+ }
187
+
188
+ resize(permits: number) {
189
+ return core.withFiber((fiber) => {
190
+ this.permits = permits
191
+ if (this.free < 0) return internal.void
192
+ this.updateTakenUnsafe(fiber, (taken) => taken)
193
+ return internal.void
194
+ })
195
+ }
196
+
197
+ release(n: number): Effect.Effect<number> {
198
+ return this.updateTaken((taken) => taken - n)
199
+ }
200
+
201
+ get releaseAll(): Effect.Effect<number> {
202
+ return this.updateTaken((_) => 0)
203
+ }
204
+
205
+ withPermits(n: number) {
206
+ return <A, E, R>(self: Effect.Effect<A, E, R>) =>
207
+ internal.uninterruptibleMask((restore) =>
208
+ internal.flatMap(
209
+ restore(this.take(n)),
210
+ (permits) =>
211
+ internal.onExitPrimitive(
212
+ restore(self),
213
+ () => {
214
+ this.updateTakenUnsafe(internal.getCurrentFiber()!, (taken) => taken - permits)
215
+ return undefined
216
+ },
217
+ true
218
+ )
219
+ )
220
+ )
221
+ }
222
+
223
+ get withPermit(): <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> {
224
+ return this.withPermits(1)
225
+ }
226
+
227
+ withPermitsIfAvailable(n: number) {
228
+ return <A, E, R>(self: Effect.Effect<A, E, R>) =>
229
+ internal.uninterruptibleMask((restore) => {
230
+ if (this.free < n) return internal.succeedNone
231
+ this.taken += n
232
+ return internal.onExitPrimitive(restore(internal.asSome(self)), () => {
233
+ this.updateTakenUnsafe(internal.getCurrentFiber()!, (taken) => taken - n)
234
+ return undefined
235
+ }, true)
236
+ })
237
+ }
238
+ }
130
239
 
131
240
  /**
132
241
  * Creates a new Semaphore.
@@ -161,196 +270,175 @@ export const makeUnsafe: (permits: number) => Semaphore = internal.makeSemaphore
161
270
  * @since 2.0.0
162
271
  * @category constructors
163
272
  */
164
- export const make: (permits: number) => Effect.Effect<Semaphore> = internal.makeSemaphore
165
-
166
- // -----------------------------------------------------------------------------
167
- // Partitioned
168
- // -----------------------------------------------------------------------------
273
+ export const make = (permits: number): Effect.Effect<Semaphore> => internal.sync(() => new SemaphoreImpl(permits))
169
274
 
170
275
  /**
171
- * @since 3.19.4
172
- * @category models
276
+ * Adjusts the number of permits available in the semaphore.
277
+ *
278
+ * @since 4.0.0
279
+ * @category combinators
173
280
  */
174
- export const PartitionedTypeId: PartitionedTypeId = "~effect/PartitionedSemaphore"
281
+ export const resize: {
282
+ /**
283
+ * Adjusts the number of permits available in the semaphore.
284
+ *
285
+ * @since 4.0.0
286
+ * @category combinators
287
+ */
288
+ (permits: number): (self: Semaphore) => Effect.Effect<void>
289
+ /**
290
+ * Adjusts the number of permits available in the semaphore.
291
+ *
292
+ * @since 4.0.0
293
+ * @category combinators
294
+ */
295
+ (self: Semaphore, permits: number): Effect.Effect<void>
296
+ } = dual(2, (self: Semaphore, permits: number) => self.resize(permits))
175
297
 
176
298
  /**
177
- * @since 3.19.4
178
- * @category models
299
+ * Runs an effect with the given number of permits and releases the permits when
300
+ * the effect completes.
301
+ *
302
+ * @since 4.0.0
303
+ * @category combinators
179
304
  */
180
- export type PartitionedTypeId = "~effect/PartitionedSemaphore"
305
+ export const withPermits: {
306
+ /**
307
+ * Runs an effect with the given number of permits and releases the permits when
308
+ * the effect completes.
309
+ *
310
+ * @since 4.0.0
311
+ * @category combinators
312
+ */
313
+ (self: Semaphore, permits: number): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
314
+ /**
315
+ * Runs an effect with the given number of permits and releases the permits when
316
+ * the effect completes.
317
+ *
318
+ * @since 4.0.0
319
+ * @category combinators
320
+ */
321
+ <A, E, R>(self: Semaphore, permits: number, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>
322
+ } = ((self: Semaphore, permits: number, effect?: Effect.Effect<any, any, any>) => {
323
+ const withPermits = self.withPermits(permits)
324
+ return effect ? withPermits(effect) : withPermits
325
+ }) as any
181
326
 
182
327
  /**
183
- * A `Partitioned` semaphore controls access to a shared permit pool while
184
- * tracking waiters by partition key.
185
- *
186
- * Waiting permits are distributed across partitions in round-robin order.
187
- *
188
- * **Previously Known As**
189
- *
190
- * This API replaces the following from Effect 3.x:
191
- *
192
- * - `PartitionedSemaphore.PartitionedSemaphore`
328
+ * Runs an effect with a single permit and releases the permit when the effect
329
+ * completes.
193
330
  *
194
- * @since 3.19.4
195
- * @category models
331
+ * @since 4.0.0
332
+ * @category combinators
196
333
  */
197
- export interface Partitioned<in K> {
198
- readonly [PartitionedTypeId]: PartitionedTypeId
199
- readonly withPermits: (
200
- key: K,
201
- permits: number
202
- ) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
203
- }
334
+ export const withPermit: {
335
+ /**
336
+ * Runs an effect with a single permit and releases the permit when the effect
337
+ * completes.
338
+ *
339
+ * @since 4.0.0
340
+ * @category combinators
341
+ */
342
+ (self: Semaphore): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
343
+ /**
344
+ * Runs an effect with a single permit and releases the permit when the effect
345
+ * completes.
346
+ *
347
+ * @since 4.0.0
348
+ * @category combinators
349
+ */
350
+ <A, E, R>(self: Semaphore, effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R>
351
+ } = ((self: Semaphore, effect?: Effect.Effect<any, any, any>) => {
352
+ if (!effect) return self.withPermit
353
+ return self.withPermit(effect)
354
+ }) as any
204
355
 
205
356
  /**
206
- * Creates a `Partitioned` semaphore unsafely.
357
+ * Runs an effect only if the specified number of permits are immediately
358
+ * available.
207
359
  *
208
- * **Previously Known As**
209
- *
210
- * This API replaces the following from Effect 3.x:
211
- *
212
- * - `PartitionedSemaphore.makeUnsafe`
213
- *
214
- * @since 3.19.4
215
- * @category constructors
360
+ * @since 4.0.0
361
+ * @category combinators
216
362
  */
217
- export const makePartitionedUnsafe = <K = unknown>(options: {
218
- readonly permits: number
219
- }): Partitioned<K> => {
220
- const maxPermits = Math.max(0, options.permits)
221
-
222
- if (!Number.isFinite(maxPermits)) {
223
- return {
224
- [PartitionedTypeId]: PartitionedTypeId,
225
- withPermits: () => (effect) => effect
226
- }
227
- }
228
-
229
- let totalPermits = maxPermits
230
- let waitingPermits = 0
231
-
232
- type Waiter = {
233
- permits: number
234
- readonly resume: () => void
235
- }
236
- const partitions = MutableHashMap.empty<K, Set<Waiter>>()
237
-
238
- const take = (key: K, permits: number) =>
239
- Effect.callback<void>((resume) => {
240
- if (maxPermits < permits) {
241
- resume(Effect.never)
242
- return
243
- }
244
-
245
- if (totalPermits >= permits) {
246
- totalPermits -= permits
247
- resume(Effect.void)
248
- return
249
- }
250
-
251
- const needed = permits - totalPermits
252
- const taken = permits - needed
253
- if (totalPermits > 0) {
254
- totalPermits = 0
255
- }
256
- waitingPermits += needed
257
-
258
- const waiters = Option.getOrElse(
259
- MutableHashMap.get(partitions, key),
260
- () => {
261
- const set = new Set<Waiter>()
262
- MutableHashMap.set(partitions, key, set)
263
- return set
264
- }
265
- )
266
-
267
- const entry: Waiter = {
268
- permits: needed,
269
- resume: () => {
270
- cleanup()
271
- resume(Effect.void)
272
- }
273
- }
274
-
275
- const cleanup = () => {
276
- waiters.delete(entry)
277
- if (waiters.size === 0) {
278
- MutableHashMap.remove(partitions, key)
279
- }
280
- }
281
-
282
- waiters.add(entry)
283
-
284
- return Effect.sync(() => {
285
- cleanup()
286
- waitingPermits -= entry.permits
287
- if (taken > 0) {
288
- releaseUnsafe(taken)
289
- }
290
- })
291
- })
292
-
293
- let iterator = partitions[Symbol.iterator]()
294
-
295
- const releaseUnsafe = (permits: number): void => {
296
- while (permits > 0) {
297
- if (waitingPermits === 0) {
298
- totalPermits += permits
299
- return
300
- }
301
-
302
- let state = iterator.next()
303
- if (state.done) {
304
- iterator = partitions[Symbol.iterator]()
305
- state = iterator.next()
306
- if (state.done) {
307
- return
308
- }
309
- }
310
-
311
- const waiter = state.value[1].values().next().value
312
- if (waiter === undefined) {
313
- continue
314
- }
315
-
316
- waiter.permits -= 1
317
- waitingPermits -= 1
318
-
319
- if (waiter.permits === 0) {
320
- waiter.resume()
321
- }
322
-
323
- permits -= 1
324
- }
325
- }
326
-
327
- return {
328
- [PartitionedTypeId]: PartitionedTypeId,
329
- withPermits: (key, permits) => {
330
- const takePermits = take(key, permits)
331
- return (effect) =>
332
- Effect.uninterruptibleMask((restore) =>
333
- Effect.flatMap(
334
- restore(takePermits),
335
- () => Effect.ensuring(restore(effect), Effect.sync(() => releaseUnsafe(permits)))
336
- )
337
- )
338
- }
339
- }
340
- }
363
+ export const withPermitsIfAvailable: {
364
+ /**
365
+ * Runs an effect only if the specified number of permits are immediately
366
+ * available.
367
+ *
368
+ * @since 4.0.0
369
+ * @category combinators
370
+ */
371
+ (self: Semaphore, permits: number): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<Option.Option<A>, E, R>
372
+ /**
373
+ * Runs an effect only if the specified number of permits are immediately
374
+ * available.
375
+ *
376
+ * @since 4.0.0
377
+ * @category combinators
378
+ */
379
+ <A, E, R>(self: Semaphore, permits: number, effect: Effect.Effect<A, E, R>): Effect.Effect<Option.Option<A>, E, R>
380
+ } = ((self: Semaphore, permits: number, effect?: Effect.Effect<any, any, any>) => {
381
+ const withPermits = self.withPermitsIfAvailable(permits)
382
+ return effect ? withPermits(effect) : withPermits
383
+ }) as any
341
384
 
342
385
  /**
343
- * Creates a `Partitioned` semaphore.
386
+ * Acquires the specified number of permits and returns the resulting available
387
+ * permits, suspending the task if they are not yet available.
344
388
  *
345
- * **Previously Known As**
346
- *
347
- * This API replaces the following from Effect 3.x:
389
+ * @since 4.0.0
390
+ * @category combinators
391
+ */
392
+ export const take: {
393
+ /**
394
+ * Acquires the specified number of permits and returns the resulting available
395
+ * permits, suspending the task if they are not yet available.
396
+ *
397
+ * @since 4.0.0
398
+ * @category combinators
399
+ */
400
+ (permits: number): (self: Semaphore) => Effect.Effect<number>
401
+ /**
402
+ * Acquires the specified number of permits and returns the resulting available
403
+ * permits, suspending the task if they are not yet available.
404
+ *
405
+ * @since 4.0.0
406
+ * @category combinators
407
+ */
408
+ (self: Semaphore, permits: number): Effect.Effect<number>
409
+ } = dual(2, (self: Semaphore, permits: number) => self.take(permits))
410
+
411
+ /**
412
+ * Releases the specified number of permits and returns the resulting available
413
+ * permits.
348
414
  *
349
- * - `PartitionedSemaphore.make`
415
+ * @since 4.0.0
416
+ * @category combinators
417
+ */
418
+ export const release: {
419
+ /**
420
+ * Releases the specified number of permits and returns the resulting available
421
+ * permits.
422
+ *
423
+ * @since 4.0.0
424
+ * @category combinators
425
+ */
426
+ (permits: number): (self: Semaphore) => Effect.Effect<number>
427
+ /**
428
+ * Releases the specified number of permits and returns the resulting available
429
+ * permits.
430
+ *
431
+ * @since 4.0.0
432
+ * @category combinators
433
+ */
434
+ (self: Semaphore, permits: number): Effect.Effect<number>
435
+ } = dual(2, (self: Semaphore, permits: number) => self.release(permits))
436
+
437
+ /**
438
+ * Releases all permits held by this semaphore and returns the resulting
439
+ * available permits.
350
440
  *
351
- * @since 3.19.4
352
- * @category constructors
441
+ * @since 4.0.0
442
+ * @category combinators
353
443
  */
354
- export const makePartitioned = <K = unknown>(options: {
355
- readonly permits: number
356
- }): Effect.Effect<Partitioned<K>> => Effect.sync(() => makePartitionedUnsafe<K>(options))
444
+ export const releaseAll = (self: Semaphore): Effect.Effect<number> => self.releaseAll
package/src/ServiceMap.ts CHANGED
@@ -446,6 +446,7 @@ export interface ServiceMap<in Services> extends Equal.Equal, Pipeable, Inspecta
446
446
  readonly _Services: Types.Contravariant<Services>
447
447
  }
448
448
  readonly mapUnsafe: ReadonlyMap<string, any>
449
+ mutable: boolean
449
450
  }
450
451
 
451
452
  /**
@@ -467,10 +468,11 @@ export interface ServiceMap<in Services> extends Equal.Equal, Pipeable, Inspecta
467
468
  export const makeUnsafe = <Services = never>(mapUnsafe: ReadonlyMap<string, any>): ServiceMap<Services> => {
468
469
  const self = Object.create(Proto)
469
470
  self.mapUnsafe = mapUnsafe
471
+ self.mutable = false
470
472
  return self
471
473
  }
472
474
 
473
- const Proto: Omit<ServiceMap<never>, "mapUnsafe"> = {
475
+ const Proto: Omit<ServiceMap<never>, "mapUnsafe" | "mutable"> = {
474
476
  ...PipeInspectableProto,
475
477
  [TypeId]: {
476
478
  _Services: (_: never) => _
@@ -676,11 +678,10 @@ export const add: {
676
678
  self: ServiceMap<Services>,
677
679
  key: Key<I, S>,
678
680
  service: Types.NoInfer<S>
679
- ): ServiceMap<Services | I> => {
680
- const map = new Map(self.mapUnsafe)
681
- map.set(key.key, service)
682
- return makeUnsafe(map)
683
- })
681
+ ): ServiceMap<Services | I> =>
682
+ withMapUnsafe(self, (map) => {
683
+ map.set(key.key, service)
684
+ }))
684
685
 
685
686
  /**
686
687
  * @since 4.0.0
@@ -705,15 +706,14 @@ export const addOrOmit: {
705
706
  self: ServiceMap<Services>,
706
707
  key: Key<I, S>,
707
708
  service: Option.Option<Types.NoInfer<S>>
708
- ): ServiceMap<Services | I> => {
709
- const map = new Map(self.mapUnsafe)
710
- if (service._tag === "None") {
711
- map.delete(key.key)
712
- } else {
713
- map.set(key.key, service.value)
714
- }
715
- return makeUnsafe(map)
716
- })
709
+ ): ServiceMap<Services | I> =>
710
+ withMapUnsafe(self, (map) => {
711
+ if (service._tag === "None") {
712
+ map.delete(key.key)
713
+ } else {
714
+ map.set(key.key, service.value)
715
+ }
716
+ }))
717
717
 
718
718
  /**
719
719
  * Get a service from the context that corresponds to the given key, or
@@ -1253,9 +1253,9 @@ export const merge: {
1253
1253
  } = dual(2, <Services, R1>(self: ServiceMap<Services>, that: ServiceMap<R1>): ServiceMap<Services | R1> => {
1254
1254
  if (self.mapUnsafe.size === 0) return that as any
1255
1255
  if (that.mapUnsafe.size === 0) return self as any
1256
- const map = new Map(self.mapUnsafe)
1257
- that.mapUnsafe.forEach((value, key) => map.set(key, value))
1258
- return makeUnsafe(map)
1256
+ return withMapUnsafe(self, (map) => {
1257
+ that.mapUnsafe.forEach((value, key) => map.set(key, value))
1258
+ })
1259
1259
  })
1260
1260
 
1261
1261
  /**
@@ -1333,16 +1333,14 @@ export const mergeAll = <T extends Array<unknown>>(
1333
1333
  export const pick = <S extends ReadonlyArray<Key<any, any>>>(
1334
1334
  ...services: S
1335
1335
  ) =>
1336
- <Services>(self: ServiceMap<Services>): ServiceMap<Services & Service.Identifier<S[number]>> => {
1337
- const map = new Map<string, any>()
1338
- const keySet = new Set(services.map((key) => key.key))
1339
- self.mapUnsafe.forEach((value, key) => {
1340
- if (keySet.has(key)) {
1341
- map.set(key, value)
1342
- }
1336
+ <Services>(self: ServiceMap<Services>): ServiceMap<Services & Service.Identifier<S[number]>> =>
1337
+ withMapUnsafe(self, (map) => {
1338
+ const keySet = new Set(services.map((key) => key.key))
1339
+ map.forEach((_, key) => {
1340
+ if (keySet.has(key)) return
1341
+ map.delete(key)
1342
+ })
1343
1343
  })
1344
- return makeUnsafe(map)
1345
- }
1346
1344
 
1347
1345
  /**
1348
1346
  * @example
@@ -1373,11 +1371,65 @@ export const pick = <S extends ReadonlyArray<Key<any, any>>>(
1373
1371
  export const omit = <S extends ReadonlyArray<Key<any, any>>>(
1374
1372
  ...keys: S
1375
1373
  ) =>
1376
- <Services>(self: ServiceMap<Services>): ServiceMap<Exclude<Services, Service.Identifier<S[number]>>> => {
1377
- const map = new Map(self.mapUnsafe)
1378
- for (let i = 0; i < keys.length; i++) {
1379
- map.delete(keys[i].key)
1374
+ <Services>(self: ServiceMap<Services>): ServiceMap<Exclude<Services, Service.Identifier<S[number]>>> =>
1375
+ withMapUnsafe(self, (map) => {
1376
+ for (let i = 0; i < keys.length; i++) {
1377
+ map.delete(keys[i].key)
1378
+ }
1379
+ })
1380
+
1381
+ /**
1382
+ * Perform a series of mutations on a `ServiceMap`. Prevents unnecessary copying
1383
+ * of the underlying map when multiple mutations are needed.
1384
+ *
1385
+ * @since 4.0.0
1386
+ * @category Utils
1387
+ */
1388
+ export const mutate: {
1389
+ /**
1390
+ * Perform a series of mutations on a `ServiceMap`. Prevents unnecessary copying
1391
+ * of the underlying map when multiple mutations are needed.
1392
+ *
1393
+ * @since 4.0.0
1394
+ * @category Utils
1395
+ */
1396
+ <Services, B>(f: (serviceMap: ServiceMap<Services>) => ServiceMap<B>): <Services>(self: ServiceMap<Services>) => ServiceMap<B>
1397
+ /**
1398
+ * Perform a series of mutations on a `ServiceMap`. Prevents unnecessary copying
1399
+ * of the underlying map when multiple mutations are needed.
1400
+ *
1401
+ * @since 4.0.0
1402
+ * @category Utils
1403
+ */
1404
+ <Services, B>(
1405
+ self: ServiceMap<Services>,
1406
+ f: (serviceMap: ServiceMap<Services>) => ServiceMap<B>
1407
+ ): ServiceMap<B>
1408
+ } = dual(
1409
+ 2,
1410
+ <Services, B>(self: ServiceMap<Services>, f: (serviceMap: ServiceMap<Services>) => ServiceMap<B>): ServiceMap<B> => {
1411
+ const next = makeUnsafe</**
1412
+ * Perform a series of mutations on a `ServiceMap`. Prevents unnecessary copying
1413
+ * of the underlying map when multiple mutations are needed.
1414
+ *
1415
+ * @since 4.0.0
1416
+ * @category Utils
1417
+ */
1418
+ Services>(new Map(self.mapUnsafe))
1419
+ next.mutable = true
1420
+ const result = f(next)
1421
+ result.mutable = false
1422
+ return result
1380
1423
  }
1424
+ )
1425
+
1426
+ const withMapUnsafe = <Services, B>(self: ServiceMap<Services>, f: (map: Map<string, any>) => void): ServiceMap<B> => {
1427
+ if (self.mutable) {
1428
+ f(self.mapUnsafe as any)
1429
+ return self as any
1430
+ }
1431
+ const map = new Map(self.mapUnsafe)
1432
+ f(map)
1381
1433
  return makeUnsafe(map)
1382
1434
  }
1383
1435