@sayoriqwq/effect-harness 0.0.1

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 (2055) hide show
  1. package/HARNESS.md +34 -0
  2. package/README.md +113 -0
  3. package/dist/bin/effect-harness.d.ts +2 -0
  4. package/dist/bin/effect-harness.js +39 -0
  5. package/dist/bin/effect-harness.js.map +1 -0
  6. package/dist/src/cli/Main.d.ts +6 -0
  7. package/dist/src/cli/Main.js +141 -0
  8. package/dist/src/cli/Main.js.map +1 -0
  9. package/dist/src/harness/CraftSkills.d.ts +14 -0
  10. package/dist/src/harness/CraftSkills.js +164 -0
  11. package/dist/src/harness/CraftSkills.js.map +1 -0
  12. package/dist/src/harness/Errors.d.ts +24 -0
  13. package/dist/src/harness/Errors.js +26 -0
  14. package/dist/src/harness/Errors.js.map +1 -0
  15. package/dist/src/harness/GuardrailRules.d.ts +6 -0
  16. package/dist/src/harness/GuardrailRules.js +303 -0
  17. package/dist/src/harness/GuardrailRules.js.map +1 -0
  18. package/dist/src/harness/Guardrails.d.ts +10 -0
  19. package/dist/src/harness/Guardrails.js +69 -0
  20. package/dist/src/harness/Guardrails.js.map +1 -0
  21. package/dist/src/harness/Init.d.ts +9 -0
  22. package/dist/src/harness/Init.js +234 -0
  23. package/dist/src/harness/Init.js.map +1 -0
  24. package/dist/src/harness/Model.d.ts +44 -0
  25. package/dist/src/harness/Model.js +169 -0
  26. package/dist/src/harness/Model.js.map +1 -0
  27. package/dist/src/harness/ModuleSources.d.ts +5 -0
  28. package/dist/src/harness/ModuleSources.js +47 -0
  29. package/dist/src/harness/ModuleSources.js.map +1 -0
  30. package/dist/src/harness/PnpmWorkspace.d.ts +2 -0
  31. package/dist/src/harness/PnpmWorkspace.js +23 -0
  32. package/dist/src/harness/PnpmWorkspace.js.map +1 -0
  33. package/dist/src/harness/Publish.d.ts +53 -0
  34. package/dist/src/harness/Publish.js +282 -0
  35. package/dist/src/harness/Publish.js.map +1 -0
  36. package/dist/src/harness/SelfVerify.d.ts +4 -0
  37. package/dist/src/harness/SelfVerify.js +56 -0
  38. package/dist/src/harness/SelfVerify.js.map +1 -0
  39. package/dist/src/harness/SourcePin.d.ts +12 -0
  40. package/dist/src/harness/SourcePin.js +320 -0
  41. package/dist/src/harness/SourcePin.js.map +1 -0
  42. package/dist/src/harness/Status.d.ts +12 -0
  43. package/dist/src/harness/Status.js +88 -0
  44. package/dist/src/harness/Status.js.map +1 -0
  45. package/dist/src/harness/TargetVerify.d.ts +8 -0
  46. package/dist/src/harness/TargetVerify.js +432 -0
  47. package/dist/src/harness/TargetVerify.js.map +1 -0
  48. package/dist/src/harness/TestContract.d.ts +6 -0
  49. package/dist/src/harness/TestContract.js +45 -0
  50. package/dist/src/harness/TestContract.js.map +1 -0
  51. package/dist/src/platform/Json.d.ts +8 -0
  52. package/dist/src/platform/Json.js +35 -0
  53. package/dist/src/platform/Json.js.map +1 -0
  54. package/dist/src/platform/ManagedFiles.d.ts +8 -0
  55. package/dist/src/platform/ManagedFiles.js +59 -0
  56. package/dist/src/platform/ManagedFiles.js.map +1 -0
  57. package/dist/src/platform/Process.d.ts +8 -0
  58. package/dist/src/platform/Process.js +80 -0
  59. package/dist/src/platform/Process.js.map +1 -0
  60. package/guide/default-capabilities.md +38 -0
  61. package/guide/index.md +49 -0
  62. package/guide/setup.md +64 -0
  63. package/harness/default-capabilities.md +32 -0
  64. package/harness/exposure.md +46 -0
  65. package/harness/feedback/index.md +60 -0
  66. package/harness/index.md +22 -0
  67. package/harness/official-inventory.md +85 -0
  68. package/harness/runtime/codex/AGENTS.fragment.md +28 -0
  69. package/harness/runtime/codex/agents/effect-worker.md +26 -0
  70. package/harness/runtime/codex/skills/effect-code/SKILL.md +72 -0
  71. package/harness/runtime/codex/skills/effect-code/agents/openai.yaml +4 -0
  72. package/harness/runtime/codex/skills/effect-feedback/SKILL.md +66 -0
  73. package/harness/runtime/codex/skills/effect-feedback/agents/openai.yaml +4 -0
  74. package/harness/source.md +52 -0
  75. package/harness/target-agent-contract.md +205 -0
  76. package/package.json +68 -0
  77. package/repos/craft-skills.manifest.json +34 -0
  78. package/repos/effect/.agents/skills/grill-me/SKILL.md +43 -0
  79. package/repos/effect/.agents/skills/jsdocs/SKILL.md +203 -0
  80. package/repos/effect/.agents/skills/scratchpad/SKILL.md +44 -0
  81. package/repos/effect/.agents/skills/scratchpad/agents/openai.yaml +7 -0
  82. package/repos/effect/.agents/skills/scratchpad/scripts/extract-example.mjs +260 -0
  83. package/repos/effect/.changeset/add-bigdecimal-sumall-multiplyall.md +5 -0
  84. package/repos/effect/.changeset/add-chunk-schema.md +5 -0
  85. package/repos/effect/.changeset/add-command-hidden.md +19 -0
  86. package/repos/effect/.changeset/add-config-nested.md +5 -0
  87. package/repos/effect/.changeset/add-flag-hidden.md +15 -0
  88. package/repos/effect/.changeset/add-from-string-schemas.md +5 -0
  89. package/repos/effect/.changeset/add-headers-remove-many.md +5 -0
  90. package/repos/effect/.changeset/add-indexeddb-kvs-layer.md +5 -0
  91. package/repos/effect/.changeset/add-make-msgpack.md +5 -0
  92. package/repos/effect/.changeset/add-make-option.md +5 -0
  93. package/repos/effect/.changeset/add-missing-tx-modules.md +11 -0
  94. package/repos/effect/.changeset/add-newtype-module.md +5 -0
  95. package/repos/effect/.changeset/add-scalar-show-operation-id.md +5 -0
  96. package/repos/effect/.changeset/add-schedule-tap.md +5 -0
  97. package/repos/effect/.changeset/add-schema-annotate-encoded.md +5 -0
  98. package/repos/effect/.changeset/add-schema-array-ensure.md +5 -0
  99. package/repos/effect/.changeset/add-schema-bigdecimal.md +5 -0
  100. package/repos/effect/.changeset/add-schema-datetime.md +5 -0
  101. package/repos/effect/.changeset/add-schema-option-from-optional-nullor.md +5 -0
  102. package/repos/effect/.changeset/add-schema-option-from-undefined-nullish.md +5 -0
  103. package/repos/effect/.changeset/add-schema-string-encoding.md +5 -0
  104. package/repos/effect/.changeset/add-sql-pglite.md +5 -0
  105. package/repos/effect/.changeset/add-standard-jsdoc-rule.md +5 -0
  106. package/repos/effect/.changeset/add-stream-broadcastn.md +5 -0
  107. package/repos/effect/.changeset/add-unstable-encoding-export.md +5 -0
  108. package/repos/effect/.changeset/afraid-cobras-like.md +5 -0
  109. package/repos/effect/.changeset/ai-openai-config-field-leak.md +6 -0
  110. package/repos/effect/.changeset/ai-openai-file-nullable-fields.md +5 -0
  111. package/repos/effect/.changeset/anthropic-4-6-structured-output.md +5 -0
  112. package/repos/effect/.changeset/asyncresult-exhaustive.md +5 -0
  113. package/repos/effect/.changeset/atom-stream-error-type.md +5 -0
  114. package/repos/effect/.changeset/beige-paths-sort.md +5 -0
  115. package/repos/effect/.changeset/better-apples-nail.md +5 -0
  116. package/repos/effect/.changeset/better-rocks-arrive.md +5 -0
  117. package/repos/effect/.changeset/big-pans-look.md +5 -0
  118. package/repos/effect/.changeset/blue-dingos-greet.md +5 -0
  119. package/repos/effect/.changeset/blue-ligers-cheat.md +5 -0
  120. package/repos/effect/.changeset/blue-onions-smile.md +5 -0
  121. package/repos/effect/.changeset/blue-ravens-type.md +5 -0
  122. package/repos/effect/.changeset/blue-trams-kiss.md +7 -0
  123. package/repos/effect/.changeset/bold-chairs-yawn.md +5 -0
  124. package/repos/effect/.changeset/bold-planets-shout.md +30 -0
  125. package/repos/effect/.changeset/breezy-meals-see.md +5 -0
  126. package/repos/effect/.changeset/bright-bugs-bow.md +5 -0
  127. package/repos/effect/.changeset/bright-canyons-clean.md +5 -0
  128. package/repos/effect/.changeset/bright-dogs-fail.md +5 -0
  129. package/repos/effect/.changeset/bright-flags-stand.md +5 -0
  130. package/repos/effect/.changeset/bright-laws-teach.md +5 -0
  131. package/repos/effect/.changeset/bright-lemons-dance.md +5 -0
  132. package/repos/effect/.changeset/bright-planes-smash.md +5 -0
  133. package/repos/effect/.changeset/bright-rats-attend.md +5 -0
  134. package/repos/effect/.changeset/bright-toes-rush.md +5 -0
  135. package/repos/effect/.changeset/bumpy-boxes-teach.md +5 -0
  136. package/repos/effect/.changeset/busy-lions-sneeze.md +5 -0
  137. package/repos/effect/.changeset/busy-maps-attend.md +7 -0
  138. package/repos/effect/.changeset/calm-buckets-own.md +5 -0
  139. package/repos/effect/.changeset/calm-carrots-march.md +7 -0
  140. package/repos/effect/.changeset/calm-cars-rest.md +5 -0
  141. package/repos/effect/.changeset/calm-panthers-nail.md +5 -0
  142. package/repos/effect/.changeset/calm-seas-smile.md +5 -0
  143. package/repos/effect/.changeset/calm-squids-hug.md +5 -0
  144. package/repos/effect/.changeset/chatty-poets-type.md +5 -0
  145. package/repos/effect/.changeset/chilled-mice-wash.md +5 -0
  146. package/repos/effect/.changeset/chilly-pumas-rule.md +5 -0
  147. package/repos/effect/.changeset/chubby-buckets-feel.md +5 -0
  148. package/repos/effect/.changeset/chubby-parents-flow.md +5 -0
  149. package/repos/effect/.changeset/chubby-planets-fall.md +5 -0
  150. package/repos/effect/.changeset/clean-balloons-tan.md +5 -0
  151. package/repos/effect/.changeset/clean-bulldogs-care.md +5 -0
  152. package/repos/effect/.changeset/clean-dryers-sneeze.md +5 -0
  153. package/repos/effect/.changeset/clean-geese-work.md +5 -0
  154. package/repos/effect/.changeset/clean-goats-wave.md +5 -0
  155. package/repos/effect/.changeset/clean-needles-shake.md +23 -0
  156. package/repos/effect/.changeset/clean-tires-guess.md +5 -0
  157. package/repos/effect/.changeset/clear-spies-boil.md +5 -0
  158. package/repos/effect/.changeset/cli-help-choices.md +5 -0
  159. package/repos/effect/.changeset/cold-knives-lie.md +35 -0
  160. package/repos/effect/.changeset/cold-rooms-show.md +5 -0
  161. package/repos/effect/.changeset/cold-sloths-wave.md +5 -0
  162. package/repos/effect/.changeset/compact-json-schema-enum.md +25 -0
  163. package/repos/effect/.changeset/config-withdefault-eager.md +7 -0
  164. package/repos/effect/.changeset/config.json +24 -0
  165. package/repos/effect/.changeset/consolidate-encoding.md +5 -0
  166. package/repos/effect/.changeset/consolidate-sql-error.md +16 -0
  167. package/repos/effect/.changeset/crisp-seas-warn.md +5 -0
  168. package/repos/effect/.changeset/cuddly-rooms-bet.md +5 -0
  169. package/repos/effect/.changeset/curly-poems-talk.md +5 -0
  170. package/repos/effect/.changeset/curly-spies-relax.md +5 -0
  171. package/repos/effect/.changeset/curvy-apples-float.md +5 -0
  172. package/repos/effect/.changeset/custom-http-security-openapi-generator.md +5 -0
  173. package/repos/effect/.changeset/cute-heads-thank.md +5 -0
  174. package/repos/effect/.changeset/cyan-loops-grow.md +5 -0
  175. package/repos/effect/.changeset/cyan-radios-switch.md +5 -0
  176. package/repos/effect/.changeset/deep-rivers-spend.md +5 -0
  177. package/repos/effect/.changeset/dirty-lamps-trade.md +5 -0
  178. package/repos/effect/.changeset/dirty-laws-wear.md +5 -0
  179. package/repos/effect/.changeset/duration-temporal-object-input.md +7 -0
  180. package/repos/effect/.changeset/eager-coats-cheat.md +5 -0
  181. package/repos/effect/.changeset/early-birds-dream.md +5 -0
  182. package/repos/effect/.changeset/early-donuts-argue.md +5 -0
  183. package/repos/effect/.changeset/early-peaches-check.md +6 -0
  184. package/repos/effect/.changeset/eff-691-default-logger-ordering.md +5 -0
  185. package/repos/effect/.changeset/eff-693-rpcgroup-handler-deps.md +5 -0
  186. package/repos/effect/.changeset/eff-694-cli-completions-module.md +5 -0
  187. package/repos/effect/.changeset/eff-695-layer-mock-dual-api.md +5 -0
  188. package/repos/effect/.changeset/eff-697-rpcserialization-json-array-decode.md +5 -0
  189. package/repos/effect/.changeset/eff-698-rpcserialization-unreachable-branch.md +5 -0
  190. package/repos/effect/.changeset/eff-700-httpapi-middleware-errors.md +12 -0
  191. package/repos/effect/.changeset/eff-701-httpapierror-respondable.md +5 -0
  192. package/repos/effect/.changeset/eff-704-stream-merge-predicate.md +5 -0
  193. package/repos/effect/.changeset/eff-705-layer-tap-apis.md +5 -0
  194. package/repos/effect/.changeset/eff-706-servicemap-mutate.md +6 -0
  195. package/repos/effect/.changeset/eff-716-response-id-tracker-map.md +5 -0
  196. package/repos/effect/.changeset/eff-717-openai-socket-cancel.md +5 -0
  197. package/repos/effect/.changeset/eff-718-embedding-model-surface.md +13 -0
  198. package/repos/effect/.changeset/eff-725-fix-catch-jsdoc.md +5 -0
  199. package/repos/effect/.changeset/eff-726-model-dimensions.md +7 -0
  200. package/repos/effect/.changeset/eff-727-cli-help-alignment.md +5 -0
  201. package/repos/effect/.changeset/eff-730-language-model-incremental-fallback.md +5 -0
  202. package/repos/effect/.changeset/eff-736-cached-with-ttl.md +5 -0
  203. package/repos/effect/.changeset/eff-738-cron-prev.md +5 -0
  204. package/repos/effect/.changeset/eff-739-openai-function-call-done.md +5 -0
  205. package/repos/effect/.changeset/eff-740-missing-summary-parts.md +5 -0
  206. package/repos/effect/.changeset/eff-742-http-client-request-web.md +5 -0
  207. package/repos/effect/.changeset/eff-744-sqlite-migrator-lock.md +5 -0
  208. package/repos/effect/.changeset/eff-746-fixed-iteration-catchup.md +5 -0
  209. package/repos/effect/.changeset/eff-747-unify-effect.md +5 -0
  210. package/repos/effect/.changeset/eff-754-url-builder-any.md +6 -0
  211. package/repos/effect/.changeset/eff-755-references-core.md +5 -0
  212. package/repos/effect/.changeset/eff-769-select-text-highlight.md +5 -0
  213. package/repos/effect/.changeset/eff-774-mutable-list-append-all-empty-array.md +5 -0
  214. package/repos/effect/.changeset/eff-777-schema-make-effect.md +5 -0
  215. package/repos/effect/.changeset/eff-778-http-middleware-path-logger.md +5 -0
  216. package/repos/effect/.changeset/eff-779-keyvaluestore-layer-sql.md +5 -0
  217. package/repos/effect/.changeset/eff-780-layer-unify.md +5 -0
  218. package/repos/effect/.changeset/eff-781-fix-stream-toqueue-types.md +5 -0
  219. package/repos/effect/.changeset/eff-782-httpapi-status-literals.md +5 -0
  220. package/repos/effect/.changeset/eff-783-atom-http-api-errors.md +5 -0
  221. package/repos/effect/.changeset/eff-819-cluster-workflow-shard-groups.md +5 -0
  222. package/repos/effect/.changeset/eight-turkeys-own.md +7 -0
  223. package/repos/effect/.changeset/eighty-lies-deny.md +5 -0
  224. package/repos/effect/.changeset/eighty-poets-draw.md +9 -0
  225. package/repos/effect/.changeset/eighty-swans-scream.md +5 -0
  226. package/repos/effect/.changeset/eighty-teeth-sniff.md +5 -0
  227. package/repos/effect/.changeset/eleven-apes-share.md +5 -0
  228. package/repos/effect/.changeset/eleven-numbers-bake.md +5 -0
  229. package/repos/effect/.changeset/empty-gifts-beg.md +5 -0
  230. package/repos/effect/.changeset/empty-http-rpc-client.md +5 -0
  231. package/repos/effect/.changeset/eventlog-unencrypted.md +5 -0
  232. package/repos/effect/.changeset/expand-schema-filter-output.md +24 -0
  233. package/repos/effect/.changeset/export-schema-encode-keys-interface.md +7 -0
  234. package/repos/effect/.changeset/extract-semaphore-latch.md +10 -0
  235. package/repos/effect/.changeset/fair-bees-relax.md +5 -0
  236. package/repos/effect/.changeset/fair-buttons-share.md +7 -0
  237. package/repos/effect/.changeset/fair-cooks-stop.md +5 -0
  238. package/repos/effect/.changeset/fair-cups-train.md +5 -0
  239. package/repos/effect/.changeset/fair-dryers-speak.md +5 -0
  240. package/repos/effect/.changeset/fair-forks-shake.md +5 -0
  241. package/repos/effect/.changeset/fair-pandas-prove.md +5 -0
  242. package/repos/effect/.changeset/fair-pants-float.md +5 -0
  243. package/repos/effect/.changeset/fair-poems-visit.md +5 -0
  244. package/repos/effect/.changeset/famous-wolves-lead.md +5 -0
  245. package/repos/effect/.changeset/fancy-glasses-grow.md +5 -0
  246. package/repos/effect/.changeset/fast-times-camp.md +5 -0
  247. package/repos/effect/.changeset/few-birds-matter.md +5 -0
  248. package/repos/effect/.changeset/few-cougars-dig.md +5 -0
  249. package/repos/effect/.changeset/few-foxes-grin.md +5 -0
  250. package/repos/effect/.changeset/few-mirrors-pull.md +14 -0
  251. package/repos/effect/.changeset/few-socks-poke.md +5 -0
  252. package/repos/effect/.changeset/fiber-runtime-start-metrics.md +5 -0
  253. package/repos/effect/.changeset/fiery-jokes-care.md +5 -0
  254. package/repos/effect/.changeset/fiery-mammals-call.md +5 -0
  255. package/repos/effect/.changeset/fine-walls-decide.md +5 -0
  256. package/repos/effect/.changeset/first-success-of.md +5 -0
  257. package/repos/effect/.changeset/five-parents-relax.md +5 -0
  258. package/repos/effect/.changeset/five-worms-rhyme.md +5 -0
  259. package/repos/effect/.changeset/fix-1332.md +5 -0
  260. package/repos/effect/.changeset/fix-1917.md +11 -0
  261. package/repos/effect/.changeset/fix-1927.md +5 -0
  262. package/repos/effect/.changeset/fix-1940.md +7 -0
  263. package/repos/effect/.changeset/fix-1947.md +7 -0
  264. package/repos/effect/.changeset/fix-2002.md +5 -0
  265. package/repos/effect/.changeset/fix-2012.md +5 -0
  266. package/repos/effect/.changeset/fix-2015.md +5 -0
  267. package/repos/effect/.changeset/fix-2260.md +5 -0
  268. package/repos/effect/.changeset/fix-2268.md +5 -0
  269. package/repos/effect/.changeset/fix-2271.md +5 -0
  270. package/repos/effect/.changeset/fix-2384.md +7 -0
  271. package/repos/effect/.changeset/fix-ai-empty-params-structured-output.md +5 -0
  272. package/repos/effect/.changeset/fix-ai-text-toolkit-typing.md +5 -0
  273. package/repos/effect/.changeset/fix-catch-orelse-error-erasure.md +5 -0
  274. package/repos/effect/.changeset/fix-class-constructor-defaults.md +5 -0
  275. package/repos/effect/.changeset/fix-cli-mixed-global-flag-context.md +7 -0
  276. package/repos/effect/.changeset/fix-config-withDefault.md +5 -0
  277. package/repos/effect/.changeset/fix-config-withdefault-filter.md +7 -0
  278. package/repos/effect/.changeset/fix-datetime-gmt.md +5 -0
  279. package/repos/effect/.changeset/fix-devtools-flush-on-teardown.md +10 -0
  280. package/repos/effect/.changeset/fix-duration-symmetric-rounding.md +5 -0
  281. package/repos/effect/.changeset/fix-entity-manager-defect-replay.md +5 -0
  282. package/repos/effect/.changeset/fix-entity-proxy-rpc-handler-context.md +5 -0
  283. package/repos/effect/.changeset/fix-entity-proxy-server-path-params.md +5 -0
  284. package/repos/effect/.changeset/fix-from-readable-stream-cancel-defect.md +5 -0
  285. package/repos/effect/.changeset/fix-graph-undirected-traversal.md +5 -0
  286. package/repos/effect/.changeset/fix-has-interrupts-only-empty.md +5 -0
  287. package/repos/effect/.changeset/fix-hashmap-bit31-ordering.md +5 -0
  288. package/repos/effect/.changeset/fix-headers-proto-enumerability.md +5 -0
  289. package/repos/effect/.changeset/fix-http-incoming-message-parse-options.md +5 -0
  290. package/repos/effect/.changeset/fix-httpapi-endpoint-error-inference.md +5 -0
  291. package/repos/effect/.changeset/fix-httpapi-schema-types.md +5 -0
  292. package/repos/effect/.changeset/fix-httpapi-security-middleware-cache.md +5 -0
  293. package/repos/effect/.changeset/fix-is-json-dag.md +7 -0
  294. package/repos/effect/.changeset/fix-json-schema-anyof-oneof-siblings.md +5 -0
  295. package/repos/effect/.changeset/fix-json-schema-import-json.md +5 -0
  296. package/repos/effect/.changeset/fix-keepalive-blocked-timers.md +5 -0
  297. package/repos/effect/.changeset/fix-mcp-param-name-resolution.md +5 -0
  298. package/repos/effect/.changeset/fix-mermaid-escape-special-chars.md +5 -0
  299. package/repos/effect/.changeset/fix-mutable-list-filter-length.md +5 -0
  300. package/repos/effect/.changeset/fix-object-keyword-json-schema.md +5 -0
  301. package/repos/effect/.changeset/fix-openai-mcp-tool-names.md +5 -0
  302. package/repos/effect/.changeset/fix-openapi-generator-form-urlencoded.md +5 -0
  303. package/repos/effect/.changeset/fix-openapi-generator-swagger2openapi.md +5 -0
  304. package/repos/effect/.changeset/fix-openapi-preserve-multiple-response-content-types.md +5 -0
  305. package/repos/effect/.changeset/fix-openrouter-sparse-array.md +5 -0
  306. package/repos/effect/.changeset/fix-otel-logger-clock-skew.md +7 -0
  307. package/repos/effect/.changeset/fix-otel-logger-severity-number.md +20 -0
  308. package/repos/effect/.changeset/fix-queue-collect-duplication.md +5 -0
  309. package/repos/effect/.changeset/fix-random-string-seeds.md +5 -0
  310. package/repos/effect/.changeset/fix-ratelimiter-tokenbucket-redis-ttl.md +5 -0
  311. package/repos/effect/.changeset/fix-remainder-scientific-notation.md +5 -0
  312. package/repos/effect/.changeset/fix-request-resolver-pending-batches-leak.md +5 -0
  313. package/repos/effect/.changeset/fix-retry-transient-autocomplete.md +5 -0
  314. package/repos/effect/.changeset/fix-rpc-http-requestids-finalizer.md +5 -0
  315. package/repos/effect/.changeset/fix-rpc-json-id-edges.md +5 -0
  316. package/repos/effect/.changeset/fix-schedule-fixed-double-exec.md +9 -0
  317. package/repos/effect/.changeset/fix-schedule-reduce-sync-state.md +5 -0
  318. package/repos/effect/.changeset/fix-schema-arbitrary-exclusive-bounds.md +5 -0
  319. package/repos/effect/.changeset/fix-schema-defect-message.md +5 -0
  320. package/repos/effect/.changeset/fix-schema-encode-keys-property-keys.md +5 -0
  321. package/repos/effect/.changeset/fix-schema-encodekeys-class.md +5 -0
  322. package/repos/effect/.changeset/fix-schema-encodekeys-struct.md +5 -0
  323. package/repos/effect/.changeset/fix-schema-identifier-expected-message.md +5 -0
  324. package/repos/effect/.changeset/fix-schema-is-uuid.md +5 -0
  325. package/repos/effect/.changeset/fix-schema-option-non-schema-failures.md +17 -0
  326. package/repos/effect/.changeset/fix-schema-parser-checks.md +9 -0
  327. package/repos/effect/.changeset/fix-searchparam-initial-decode.md +5 -0
  328. package/repos/effect/.changeset/fix-serializable-wire-transfer.md +7 -0
  329. package/repos/effect/.changeset/fix-stream-grouped-within-flush.md +5 -0
  330. package/repos/effect/.changeset/fix-stream-run-for-each-while.md +5 -0
  331. package/repos/effect/.changeset/fix-stream-scan-effect.md +5 -0
  332. package/repos/effect/.changeset/fix-stream-scoped-scope.md +5 -0
  333. package/repos/effect/.changeset/fix-strip-approval-artifacts-multi-round.md +13 -0
  334. package/repos/effect/.changeset/fix-struct-utility-types-simplify.md +5 -0
  335. package/repos/effect/.changeset/fix-structwithrest-index-signatures.md +6 -0
  336. package/repos/effect/.changeset/fix-tagged-union-class-sentinels.md +5 -0
  337. package/repos/effect/.changeset/fix-tagged-union-match-unify.md +6 -0
  338. package/repos/effect/.changeset/fix-to-tagged-union-isanyof-custom-tags.md +10 -0
  339. package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-index-drift.md +5 -0
  340. package/repos/effect/.changeset/fix-tuple-with-rest-post-rest-validation.md +5 -0
  341. package/repos/effect/.changeset/fix-types-voidifempty.md +5 -0
  342. package/repos/effect/.changeset/fix-void-response-encoding.md +5 -0
  343. package/repos/effect/.changeset/fix-workflow-proxy-rpc-handler-context.md +5 -0
  344. package/repos/effect/.changeset/flat-chicken-remain.md +5 -0
  345. package/repos/effect/.changeset/floppy-cows-spend.md +5 -0
  346. package/repos/effect/.changeset/floppy-items-admire.md +5 -0
  347. package/repos/effect/.changeset/floppy-pigs-kiss.md +5 -0
  348. package/repos/effect/.changeset/fluffy-meals-matter.md +5 -0
  349. package/repos/effect/.changeset/fluffy-pumas-push.md +5 -0
  350. package/repos/effect/.changeset/forked-memo-maps.md +6 -0
  351. package/repos/effect/.changeset/forty-hounds-cheer.md +5 -0
  352. package/repos/effect/.changeset/forty-otters-cry.md +5 -0
  353. package/repos/effect/.changeset/forty-rings-film.md +7 -0
  354. package/repos/effect/.changeset/forty-signs-stay.md +5 -0
  355. package/repos/effect/.changeset/forty-swans-divide.md +5 -0
  356. package/repos/effect/.changeset/forty-trees-pay.md +5 -0
  357. package/repos/effect/.changeset/four-papayas-bow.md +5 -0
  358. package/repos/effect/.changeset/four-points-repeat.md +5 -0
  359. package/repos/effect/.changeset/fresh-cats-smash.md +5 -0
  360. package/repos/effect/.changeset/fresh-emus-cheat.md +5 -0
  361. package/repos/effect/.changeset/fresh-monkeys-smoke.md +9 -0
  362. package/repos/effect/.changeset/fruity-houses-learn.md +6 -0
  363. package/repos/effect/.changeset/full-adults-double.md +5 -0
  364. package/repos/effect/.changeset/funny-crabs-hang.md +6 -0
  365. package/repos/effect/.changeset/funny-forks-move.md +5 -0
  366. package/repos/effect/.changeset/fuzzy-camels-hunt.md +5 -0
  367. package/repos/effect/.changeset/fuzzy-dodos-help.md +5 -0
  368. package/repos/effect/.changeset/fuzzy-lions-perform.md +5 -0
  369. package/repos/effect/.changeset/fuzzy-planets-sneeze.md +5 -0
  370. package/repos/effect/.changeset/gold-meteors-move.md +5 -0
  371. package/repos/effect/.changeset/gold-readers-hug.md +5 -0
  372. package/repos/effect/.changeset/gold-rings-start.md +5 -0
  373. package/repos/effect/.changeset/good-tools-work.md +7 -0
  374. package/repos/effect/.changeset/graph-algorithm-fixes.md +5 -0
  375. package/repos/effect/.changeset/great-trains-mate.md +5 -0
  376. package/repos/effect/.changeset/great-trams-report.md +5 -0
  377. package/repos/effect/.changeset/green-beds-unref.md +7 -0
  378. package/repos/effect/.changeset/green-chips-wash.md +5 -0
  379. package/repos/effect/.changeset/green-moons-smile.md +5 -0
  380. package/repos/effect/.changeset/green-pugs-play.md +5 -0
  381. package/repos/effect/.changeset/green-rings-prove.md +5 -0
  382. package/repos/effect/.changeset/happy-mirrors-dream.md +5 -0
  383. package/repos/effect/.changeset/heavy-loops-cut.md +5 -0
  384. package/repos/effect/.changeset/heavy-trams-fix.md +5 -0
  385. package/repos/effect/.changeset/hip-socks-travel.md +5 -0
  386. package/repos/effect/.changeset/honest-pens-thank.md +5 -0
  387. package/repos/effect/.changeset/honest-rivers-notice.md +5 -0
  388. package/repos/effect/.changeset/hot-taxis-fry.md +5 -0
  389. package/repos/effect/.changeset/httpapi-endpoint-relax-constraints.md +5 -0
  390. package/repos/effect/.changeset/httpapi-schema-service-types.md +6 -0
  391. package/repos/effect/.changeset/huge-moons-rhyme.md +5 -0
  392. package/repos/effect/.changeset/humble-pigs-dig.md +5 -0
  393. package/repos/effect/.changeset/icy-flies-cross.md +5 -0
  394. package/repos/effect/.changeset/itchy-radios-poke.md +5 -0
  395. package/repos/effect/.changeset/itchy-results-bet.md +5 -0
  396. package/repos/effect/.changeset/itchy-shrimps-deny.md +5 -0
  397. package/repos/effect/.changeset/itchy-toes-promise.md +5 -0
  398. package/repos/effect/.changeset/k8s-last-transition-null.md +5 -0
  399. package/repos/effect/.changeset/khaki-cats-learn.md +5 -0
  400. package/repos/effect/.changeset/khaki-melons-appear.md +5 -0
  401. package/repos/effect/.changeset/kind-hounds-float.md +5 -0
  402. package/repos/effect/.changeset/kind-windows-fall.md +5 -0
  403. package/repos/effect/.changeset/late-hotels-rule.md +5 -0
  404. package/repos/effect/.changeset/late-lamps-care.md +5 -0
  405. package/repos/effect/.changeset/late-rivers-applaud.md +5 -0
  406. package/repos/effect/.changeset/layer-map-dynamic-idle-ttl.md +5 -0
  407. package/repos/effect/.changeset/lazy-queens-rush.md +5 -0
  408. package/repos/effect/.changeset/lazy-recursive-forward-refs.md +5 -0
  409. package/repos/effect/.changeset/lazy-timers-exist.md +5 -0
  410. package/repos/effect/.changeset/legal-pants-drop.md +5 -0
  411. package/repos/effect/.changeset/lemon-taxis-sin.md +5 -0
  412. package/repos/effect/.changeset/light-kids-sneeze.md +5 -0
  413. package/repos/effect/.changeset/little-dryers-allow.md +7 -0
  414. package/repos/effect/.changeset/long-cameras-think.md +5 -0
  415. package/repos/effect/.changeset/lovely-cobras-change.md +5 -0
  416. package/repos/effect/.changeset/lovely-frogs-rescue.md +5 -0
  417. package/repos/effect/.changeset/lucky-buttons-jump.md +5 -0
  418. package/repos/effect/.changeset/lucky-phones-listen.md +5 -0
  419. package/repos/effect/.changeset/lucky-worms-type.md +5 -0
  420. package/repos/effect/.changeset/mean-dingos-share.md +5 -0
  421. package/repos/effect/.changeset/mean-trains-smash.md +5 -0
  422. package/repos/effect/.changeset/metal-parts-yell.md +5 -0
  423. package/repos/effect/.changeset/mighty-games-matter.md +5 -0
  424. package/repos/effect/.changeset/modern-uuid-guid-filter.md +5 -0
  425. package/repos/effect/.changeset/nasty-geese-grow.md +5 -0
  426. package/repos/effect/.changeset/neat-goats-wave.md +5 -0
  427. package/repos/effect/.changeset/neat-kings-chew.md +5 -0
  428. package/repos/effect/.changeset/neat-lions-rest.md +5 -0
  429. package/repos/effect/.changeset/neat-snails-wash.md +5 -0
  430. package/repos/effect/.changeset/neat-taxis-notice.md +5 -0
  431. package/repos/effect/.changeset/new-dogs-swim.md +5 -0
  432. package/repos/effect/.changeset/new-toes-stop.md +5 -0
  433. package/repos/effect/.changeset/ninety-geese-exist.md +5 -0
  434. package/repos/effect/.changeset/odd-boats-think.md +5 -0
  435. package/repos/effect/.changeset/odd-bulldogs-sleep.md +5 -0
  436. package/repos/effect/.changeset/odd-fans-glow.md +5 -0
  437. package/repos/effect/.changeset/odd-forks-talk.md +5 -0
  438. package/repos/effect/.changeset/odd-laws-draw.md +5 -0
  439. package/repos/effect/.changeset/odd-owls-smoke.md +5 -0
  440. package/repos/effect/.changeset/odd-socks-boil.md +5 -0
  441. package/repos/effect/.changeset/odd-suns-dance.md +5 -0
  442. package/repos/effect/.changeset/old-brooms-cry.md +5 -0
  443. package/repos/effect/.changeset/old-facts-stand.md +5 -0
  444. package/repos/effect/.changeset/old-mirrors-float.md +5 -0
  445. package/repos/effect/.changeset/olive-poems-visit.md +5 -0
  446. package/repos/effect/.changeset/open-hotels-remain.md +5 -0
  447. package/repos/effect/.changeset/openai-compat-nullable-tool-name.md +7 -0
  448. package/repos/effect/.changeset/openai-compat-reasoning.md +5 -0
  449. package/repos/effect/.changeset/otel-resource-env-precedence.md +5 -0
  450. package/repos/effect/.changeset/perfect-buckets-tickle.md +5 -0
  451. package/repos/effect/.changeset/petite-months-allow.md +6 -0
  452. package/repos/effect/.changeset/platform-crypto-service.md +9 -0
  453. package/repos/effect/.changeset/platform-node-shared-barrel.md +5 -0
  454. package/repos/effect/.changeset/plenty-moons-pull.md +5 -0
  455. package/repos/effect/.changeset/polite-brooms-tickle.md +5 -0
  456. package/repos/effect/.changeset/polite-pigs-speak.md +5 -0
  457. package/repos/effect/.changeset/polite-tables-kneel.md +5 -0
  458. package/repos/effect/.changeset/port-react-hydration.md +8 -0
  459. package/repos/effect/.changeset/pre.json +588 -0
  460. package/repos/effect/.changeset/public-deer-ring.md +5 -0
  461. package/repos/effect/.changeset/public-jeans-stop.md +5 -0
  462. package/repos/effect/.changeset/pubsub-publish-false.md +5 -0
  463. package/repos/effect/.changeset/puny-pens-clap.md +6 -0
  464. package/repos/effect/.changeset/purple-bars-prove.md +5 -0
  465. package/repos/effect/.changeset/purple-schools-float.md +5 -0
  466. package/repos/effect/.changeset/purple-turtles-draw.md +5 -0
  467. package/repos/effect/.changeset/quick-dragons-fix.md +5 -0
  468. package/repos/effect/.changeset/quick-falcons-travel.md +5 -0
  469. package/repos/effect/.changeset/quick-geese-relax.md +5 -0
  470. package/repos/effect/.changeset/quick-lamps-dig.md +5 -0
  471. package/repos/effect/.changeset/quick-lizards-fall.md +5 -0
  472. package/repos/effect/.changeset/quick-trees-join.md +5 -0
  473. package/repos/effect/.changeset/quiet-carpets-grin.md +5 -0
  474. package/repos/effect/.changeset/quiet-files-hunt.md +5 -0
  475. package/repos/effect/.changeset/quiet-lamps-jam.md +5 -0
  476. package/repos/effect/.changeset/quiet-radios-wave.md +5 -0
  477. package/repos/effect/.changeset/quiet-redis-scripts.md +5 -0
  478. package/repos/effect/.changeset/ready-olives-divide.md +5 -0
  479. package/repos/effect/.changeset/real-trains-ring.md +5 -0
  480. package/repos/effect/.changeset/red-pigs-repair.md +5 -0
  481. package/repos/effect/.changeset/redacted-representation-options.md +7 -0
  482. package/repos/effect/.changeset/refactor-cli-global-flags.md +27 -0
  483. package/repos/effect/.changeset/refactor-config-provider.md +23 -0
  484. package/repos/effect/.changeset/refactor-representation-references.md +5 -0
  485. package/repos/effect/.changeset/remove-effect-transactionwith.md +5 -0
  486. package/repos/effect/.changeset/remove-http-span-counter.md +5 -0
  487. package/repos/effect/.changeset/remove-nullor.md +5 -0
  488. package/repos/effect/.changeset/remove-openapi-fromapi-options.md +7 -0
  489. package/repos/effect/.changeset/remove-types-mergerecord.md +5 -0
  490. package/repos/effect/.changeset/remove-unused-utils-apis.md +5 -0
  491. package/repos/effect/.changeset/rename-rebuild-out.md +5 -0
  492. package/repos/effect/.changeset/restore-schema-parse-options.md +5 -0
  493. package/repos/effect/.changeset/rich-dots-push.md +5 -0
  494. package/repos/effect/.changeset/rich-hoops-nail.md +5 -0
  495. package/repos/effect/.changeset/rich-sloths-draw.md +5 -0
  496. package/repos/effect/.changeset/ripe-lies-battle.md +5 -0
  497. package/repos/effect/.changeset/rpc-middleware-provides-fix.md +5 -0
  498. package/repos/effect/.changeset/scalar-custom-fetch.md +5 -0
  499. package/repos/effect/.changeset/schema-as-class.md +17 -0
  500. package/repos/effect/.changeset/schema-asserts-signature.md +5 -0
  501. package/repos/effect/.changeset/schema-clean-up-additionalProperties.md +7 -0
  502. package/repos/effect/.changeset/schema-datetime-utc-from-string.md +5 -0
  503. package/repos/effect/.changeset/schema-decoding-defaults-services.md +7 -0
  504. package/repos/effect/.changeset/schema-defaults-issue-channel.md +7 -0
  505. package/repos/effect/.changeset/schema-dollar-prefix.md +5 -0
  506. package/repos/effect/.changeset/schema-missing-self-generic.md +5 -0
  507. package/repos/effect/.changeset/schema-ordered-arbitrary-constraints.md +12 -0
  508. package/repos/effect/.changeset/schema-parser-adapter-errors.md +5 -0
  509. package/repos/effect/.changeset/schema-refactor-toCodecJson.md +5 -0
  510. package/repos/effect/.changeset/schema-remove-annotate-in.md +5 -0
  511. package/repos/effect/.changeset/schema-rename-makeUnsafe-to-make.md +7 -0
  512. package/repos/effect/.changeset/schema-rename-parser-makeUnsafe.md +5 -0
  513. package/repos/effect/.changeset/schema-result-combinators.md +5 -0
  514. package/repos/effect/.changeset/schema-struct-simplify.md +5 -0
  515. package/repos/effect/.changeset/seven-mugs-marry.md +5 -0
  516. package/repos/effect/.changeset/shaggy-birds-stay.md +5 -0
  517. package/repos/effect/.changeset/shaggy-cities-push.md +5 -0
  518. package/repos/effect/.changeset/shaggy-numbers-accept.md +5 -0
  519. package/repos/effect/.changeset/sharp-emus-applaud.md +5 -0
  520. package/repos/effect/.changeset/sharp-goats-wink.md +5 -0
  521. package/repos/effect/.changeset/sharp-pandas-care.md +5 -0
  522. package/repos/effect/.changeset/sharp-peas-march.md +5 -0
  523. package/repos/effect/.changeset/sharp-rules-draw.md +5 -0
  524. package/repos/effect/.changeset/sharp-singers-sort.md +5 -0
  525. package/repos/effect/.changeset/shiny-trains-hug.md +5 -0
  526. package/repos/effect/.changeset/short-cows-relate.md +5 -0
  527. package/repos/effect/.changeset/short-foxes-admire.md +5 -0
  528. package/repos/effect/.changeset/shy-cycles-flow.md +5 -0
  529. package/repos/effect/.changeset/shy-geckos-sniff.md +30 -0
  530. package/repos/effect/.changeset/silent-geckos-matter.md +5 -0
  531. package/repos/effect/.changeset/silent-needles-design.md +6 -0
  532. package/repos/effect/.changeset/silent-plants-matter.md +8 -0
  533. package/repos/effect/.changeset/silent-spoons-stare.md +5 -0
  534. package/repos/effect/.changeset/silly-loops-tickle.md +5 -0
  535. package/repos/effect/.changeset/silver-bulk-indexeddb.md +5 -0
  536. package/repos/effect/.changeset/silver-emus-smoke.md +5 -0
  537. package/repos/effect/.changeset/silver-kings-poke.md +5 -0
  538. package/repos/effect/.changeset/silver-snails-sqlite.md +17 -0
  539. package/repos/effect/.changeset/silver-wings-watch.md +5 -0
  540. package/repos/effect/.changeset/six-cups-taste.md +5 -0
  541. package/repos/effect/.changeset/sixty-mails-shout.md +5 -0
  542. package/repos/effect/.changeset/sixty-socks-yell.md +5 -0
  543. package/repos/effect/.changeset/slimy-planets-divide.md +5 -0
  544. package/repos/effect/.changeset/slimy-turtles-juggle.md +5 -0
  545. package/repos/effect/.changeset/slow-beans-battle.md +28 -0
  546. package/repos/effect/.changeset/slow-berries-enjoy.md +5 -0
  547. package/repos/effect/.changeset/small-bugs-hunt.md +5 -0
  548. package/repos/effect/.changeset/small-crabs-care.md +9 -0
  549. package/repos/effect/.changeset/small-pets-sit.md +6 -0
  550. package/repos/effect/.changeset/smart-ducks-jump.md +6 -0
  551. package/repos/effect/.changeset/smart-pillows-buy.md +6 -0
  552. package/repos/effect/.changeset/smart-timers-fly.md +5 -0
  553. package/repos/effect/.changeset/smart-tips-sort.md +5 -0
  554. package/repos/effect/.changeset/social-pumas-prove.md +5 -0
  555. package/repos/effect/.changeset/soft-comics-wink.md +5 -0
  556. package/repos/effect/.changeset/soft-delete-sqlmodel.md +5 -0
  557. package/repos/effect/.changeset/soft-seals-allow.md +5 -0
  558. package/repos/effect/.changeset/solid-cougars-attack.md +5 -0
  559. package/repos/effect/.changeset/solid-doors-ring.md +5 -0
  560. package/repos/effect/.changeset/solid-items-tease.md +5 -0
  561. package/repos/effect/.changeset/solid-towns-smoke.md +5 -0
  562. package/repos/effect/.changeset/sour-canyons-rescue.md +5 -0
  563. package/repos/effect/.changeset/sparkly-bears-act.md +5 -0
  564. package/repos/effect/.changeset/sparkly-coins-sit.md +5 -0
  565. package/repos/effect/.changeset/spotty-comics-fry.md +5 -0
  566. package/repos/effect/.changeset/sql-migrator-mjs-mts.md +5 -0
  567. package/repos/effect/.changeset/stale-dots-tell.md +5 -0
  568. package/repos/effect/.changeset/stale-snakes-know.md +5 -0
  569. package/repos/effect/.changeset/strict-areas-end.md +5 -0
  570. package/repos/effect/.changeset/strict-buckets-hug.md +8 -0
  571. package/repos/effect/.changeset/strip-resolved-approvals.md +5 -0
  572. package/repos/effect/.changeset/strong-balloons-tickle.md +5 -0
  573. package/repos/effect/.changeset/strong-bees-queue.md +5 -0
  574. package/repos/effect/.changeset/struct-record.md +5 -0
  575. package/repos/effect/.changeset/sunny-ads-hang.md +5 -0
  576. package/repos/effect/.changeset/sunny-bikes-sleep.md +5 -0
  577. package/repos/effect/.changeset/sunny-rooms-invent.md +5 -0
  578. package/repos/effect/.changeset/sweet-donuts-bet.md +5 -0
  579. package/repos/effect/.changeset/sweet-hotels-give.md +5 -0
  580. package/repos/effect/.changeset/sweet-views-learn.md +5 -0
  581. package/repos/effect/.changeset/swift-spiders-unpack.md +5 -0
  582. package/repos/effect/.changeset/swift-symbols-stand.md +5 -0
  583. package/repos/effect/.changeset/tagged-error-class-optional-empty-props.md +5 -0
  584. package/repos/effect/.changeset/tall-hairs-return.md +5 -0
  585. package/repos/effect/.changeset/tall-mails-listen.md +5 -0
  586. package/repos/effect/.changeset/tall-queens-cheer.md +5 -0
  587. package/repos/effect/.changeset/tall-wombats-wave.md +5 -0
  588. package/repos/effect/.changeset/tangy-colts-lose.md +5 -0
  589. package/repos/effect/.changeset/tasty-comics-send.md +5 -0
  590. package/repos/effect/.changeset/ten-kings-fry.md +5 -0
  591. package/repos/effect/.changeset/thick-pandas-wait.md +5 -0
  592. package/repos/effect/.changeset/thin-ducks-wonder.md +5 -0
  593. package/repos/effect/.changeset/thirty-ducks-go.md +5 -0
  594. package/repos/effect/.changeset/thirty-pans-love.md +5 -0
  595. package/repos/effect/.changeset/three-corners-sort.md +5 -0
  596. package/repos/effect/.changeset/three-ravens-jam.md +5 -0
  597. package/repos/effect/.changeset/three-tomatoes-wave.md +5 -0
  598. package/repos/effect/.changeset/tidy-foxes-own.md +5 -0
  599. package/repos/effect/.changeset/tidy-icons-glow.md +5 -0
  600. package/repos/effect/.changeset/tidy-stacks-encode.md +5 -0
  601. package/repos/effect/.changeset/tidy-stars-drive.md +5 -0
  602. package/repos/effect/.changeset/tiny-buckets-wave.md +5 -0
  603. package/repos/effect/.changeset/tiny-lilies-flash.md +5 -0
  604. package/repos/effect/.changeset/tiny-rabbits-smile.md +5 -0
  605. package/repos/effect/.changeset/tocodecjson-return-json-type.md +10 -0
  606. package/repos/effect/.changeset/tool-get-json-schema-tests.md +5 -0
  607. package/repos/effect/.changeset/true-actors-battle.md +5 -0
  608. package/repos/effect/.changeset/twenty-buttons-cheer.md +5 -0
  609. package/repos/effect/.changeset/two-roses-double.md +5 -0
  610. package/repos/effect/.changeset/unify-error-defect-stack-options.md +23 -0
  611. package/repos/effect/.changeset/update-schema-arbitrary-report.md +22 -0
  612. package/repos/effect/.changeset/upset-colts-stick.md +5 -0
  613. package/repos/effect/.changeset/vast-bananas-send.md +5 -0
  614. package/repos/effect/.changeset/vast-deserts-travel.md +5 -0
  615. package/repos/effect/.changeset/violet-peaches-feel.md +5 -0
  616. package/repos/effect/.changeset/vitest-layer-top-level-options.md +5 -0
  617. package/repos/effect/.changeset/wacky-grapes-poke.md +5 -0
  618. package/repos/effect/.changeset/wacky-rice-add.md +5 -0
  619. package/repos/effect/.changeset/warm-dolls-brake.md +5 -0
  620. package/repos/effect/.changeset/warm-friends-tie.md +5 -0
  621. package/repos/effect/.changeset/warm-snails-shop.md +7 -0
  622. package/repos/effect/.changeset/wet-news-invent.md +5 -0
  623. package/repos/effect/.changeset/wild-readers-clean.md +5 -0
  624. package/repos/effect/.changeset/wild-suns-bearer-space.md +5 -0
  625. package/repos/effect/.changeset/wise-ants-wave.md +6 -0
  626. package/repos/effect/.changeset/wise-flags-shift.md +22 -0
  627. package/repos/effect/.changeset/wise-oranges-stay.md +5 -0
  628. package/repos/effect/.changeset/witty-lobsters-share.md +5 -0
  629. package/repos/effect/.changeset/yellow-adults-study.md +5 -0
  630. package/repos/effect/.changeset/yellow-clocks-dance.md +5 -0
  631. package/repos/effect/.changeset/yellow-dingos-jump.md +5 -0
  632. package/repos/effect/.changeset/young-doors-change.md +5 -0
  633. package/repos/effect/.envrc +1 -0
  634. package/repos/effect/.github/actions/setup/action.yaml +33 -0
  635. package/repos/effect/.github/workflows/ai-codegen.yml +66 -0
  636. package/repos/effect/.github/workflows/bundle-comment.yml +72 -0
  637. package/repos/effect/.github/workflows/check.yml +195 -0
  638. package/repos/effect/.github/workflows/release.yml +47 -0
  639. package/repos/effect/.github/workflows/snapshot.yml +34 -0
  640. package/repos/effect/.oxlintrc.json +25 -0
  641. package/repos/effect/.patterns/effect.md +102 -0
  642. package/repos/effect/.patterns/jsdoc.md +53 -0
  643. package/repos/effect/.patterns/testing.md +44 -0
  644. package/repos/effect/.specs/README.md +2 -0
  645. package/repos/effect/.vscode/extensions.json +6 -0
  646. package/repos/effect/.vscode/settings.json +44 -0
  647. package/repos/effect/AGENTS.md +139 -0
  648. package/repos/effect/LICENSE +21 -0
  649. package/repos/effect/LLMS.md +343 -0
  650. package/repos/effect/MIGRATION.md +83 -0
  651. package/repos/effect/README.md +3 -0
  652. package/repos/effect/TODOS.md +28 -0
  653. package/repos/effect/ai-docs/README.md +44 -0
  654. package/repos/effect/ai-docs/package.json +36 -0
  655. package/repos/effect/ai-docs/src/01_effect/01_basics/01_effect-gen.ts +30 -0
  656. package/repos/effect/ai-docs/src/01_effect/01_basics/02_effect-fn.ts +39 -0
  657. package/repos/effect/ai-docs/src/01_effect/01_basics/10_creating-effects.ts +74 -0
  658. package/repos/effect/ai-docs/src/01_effect/01_basics/index.md +5 -0
  659. package/repos/effect/ai-docs/src/01_effect/02_services/01_service.ts +45 -0
  660. package/repos/effect/ai-docs/src/01_effect/02_services/10_reference.ts +10 -0
  661. package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-composition.ts +70 -0
  662. package/repos/effect/ai-docs/src/01_effect/02_services/20_layer-unwrap.ts +66 -0
  663. package/repos/effect/ai-docs/src/01_effect/02_services/index.md +5 -0
  664. package/repos/effect/ai-docs/src/01_effect/03_errors/01_error-handling.ts +30 -0
  665. package/repos/effect/ai-docs/src/01_effect/03_errors/10_catch-tags.ts +24 -0
  666. package/repos/effect/ai-docs/src/01_effect/03_errors/20_reason-errors.ts +64 -0
  667. package/repos/effect/ai-docs/src/01_effect/03_errors/index.md +1 -0
  668. package/repos/effect/ai-docs/src/01_effect/04_resources/10_acquire-release.ts +105 -0
  669. package/repos/effect/ai-docs/src/01_effect/04_resources/20_layer-side-effects.ts +31 -0
  670. package/repos/effect/ai-docs/src/01_effect/04_resources/30_layer-map.ts +86 -0
  671. package/repos/effect/ai-docs/src/01_effect/04_resources/index.md +3 -0
  672. package/repos/effect/ai-docs/src/01_effect/05_running/10_run-main.ts +30 -0
  673. package/repos/effect/ai-docs/src/01_effect/05_running/20_layer-launch.ts +27 -0
  674. package/repos/effect/ai-docs/src/01_effect/05_running/index.md +1 -0
  675. package/repos/effect/ai-docs/src/01_effect/06_pubsub/10_pubsub.ts +56 -0
  676. package/repos/effect/ai-docs/src/01_effect/06_pubsub/index.md +3 -0
  677. package/repos/effect/ai-docs/src/02_stream/10_creating-streams.ts +103 -0
  678. package/repos/effect/ai-docs/src/02_stream/20_consuming-streams.ts +137 -0
  679. package/repos/effect/ai-docs/src/02_stream/30_encoding.ts +165 -0
  680. package/repos/effect/ai-docs/src/02_stream/index.md +4 -0
  681. package/repos/effect/ai-docs/src/03_integration/10_managed-runtime.ts +129 -0
  682. package/repos/effect/ai-docs/src/03_integration/index.md +5 -0
  683. package/repos/effect/ai-docs/src/05_batching/10_request-resolver.ts +89 -0
  684. package/repos/effect/ai-docs/src/05_batching/index.md +3 -0
  685. package/repos/effect/ai-docs/src/06_schedule/10_schedules.ts +102 -0
  686. package/repos/effect/ai-docs/src/06_schedule/index.md +3 -0
  687. package/repos/effect/ai-docs/src/07_datetime/10_creating-and-formatting.ts +30 -0
  688. package/repos/effect/ai-docs/src/07_datetime/20_time-zones.ts +44 -0
  689. package/repos/effect/ai-docs/src/07_datetime/index.md +5 -0
  690. package/repos/effect/ai-docs/src/08_observability/10_logging.ts +66 -0
  691. package/repos/effect/ai-docs/src/08_observability/20_otlp-tracing.ts +95 -0
  692. package/repos/effect/ai-docs/src/08_observability/index.md +7 -0
  693. package/repos/effect/ai-docs/src/09_testing/10_effect-tests.ts +55 -0
  694. package/repos/effect/ai-docs/src/09_testing/20_layer-tests.ts +138 -0
  695. package/repos/effect/ai-docs/src/09_testing/index.md +1 -0
  696. package/repos/effect/ai-docs/src/50_http-client/10_basics.ts +102 -0
  697. package/repos/effect/ai-docs/src/50_http-client/index.md +3 -0
  698. package/repos/effect/ai-docs/src/51_http-server/10_basics.ts +116 -0
  699. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Api.ts +14 -0
  700. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Authorization.ts +36 -0
  701. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/System.ts +10 -0
  702. package/repos/effect/ai-docs/src/51_http-server/fixtures/api/Users.ts +91 -0
  703. package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/User.ts +12 -0
  704. package/repos/effect/ai-docs/src/51_http-server/fixtures/domain/UserErrors.ts +22 -0
  705. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Authorization.ts +36 -0
  706. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users/http.ts +71 -0
  707. package/repos/effect/ai-docs/src/51_http-server/fixtures/server/Users.ts +62 -0
  708. package/repos/effect/ai-docs/src/51_http-server/index.md +3 -0
  709. package/repos/effect/ai-docs/src/60_child-process/10_working-with-child-processes.ts +117 -0
  710. package/repos/effect/ai-docs/src/60_child-process/index.md +3 -0
  711. package/repos/effect/ai-docs/src/70_cli/10_basics.ts +136 -0
  712. package/repos/effect/ai-docs/src/70_cli/index.md +5 -0
  713. package/repos/effect/ai-docs/src/71_ai/10_language-model.ts +156 -0
  714. package/repos/effect/ai-docs/src/71_ai/20_tools.ts +226 -0
  715. package/repos/effect/ai-docs/src/71_ai/30_chat.ts +158 -0
  716. package/repos/effect/ai-docs/src/71_ai/fixtures/domain/LaunchPlan.ts +9 -0
  717. package/repos/effect/ai-docs/src/71_ai/index.md +5 -0
  718. package/repos/effect/ai-docs/src/80_cluster/10_entities.ts +97 -0
  719. package/repos/effect/ai-docs/src/80_cluster/index.md +4 -0
  720. package/repos/effect/ai-docs/src/index.md +12 -0
  721. package/repos/effect/ai-docs/tsconfig.json +24 -0
  722. package/repos/effect/cookbooks/schedule.md +3507 -0
  723. package/repos/effect/deno.json +33 -0
  724. package/repos/effect/docker-compose.yaml +18 -0
  725. package/repos/effect/dprint.json +32 -0
  726. package/repos/effect/flake.lock +27 -0
  727. package/repos/effect/flake.nix +24 -0
  728. package/repos/effect/jsdocs.config.json +16 -0
  729. package/repos/effect/migration/cause.md +163 -0
  730. package/repos/effect/migration/equality.md +72 -0
  731. package/repos/effect/migration/error-handling.md +106 -0
  732. package/repos/effect/migration/fiber-keep-alive.md +74 -0
  733. package/repos/effect/migration/fiberref.md +109 -0
  734. package/repos/effect/migration/forking.md +94 -0
  735. package/repos/effect/migration/generators.md +32 -0
  736. package/repos/effect/migration/layer-memoization.md +98 -0
  737. package/repos/effect/migration/runtime.md +88 -0
  738. package/repos/effect/migration/schema.md +1032 -0
  739. package/repos/effect/migration/scope.md +50 -0
  740. package/repos/effect/migration/services.md +235 -0
  741. package/repos/effect/migration/v3-to-v4.md +421 -0
  742. package/repos/effect/migration/yieldable.md +173 -0
  743. package/repos/effect/package.json +104 -0
  744. package/repos/effect/packages/ai/anthropic/CHANGELOG.md +611 -0
  745. package/repos/effect/packages/ai/anthropic/codegen.yml +63 -0
  746. package/repos/effect/packages/ai/anthropic/docgen.json +26 -0
  747. package/repos/effect/packages/ai/anthropic/package.json +67 -0
  748. package/repos/effect/packages/ai/anthropic/src/AnthropicClient.ts +432 -0
  749. package/repos/effect/packages/ai/anthropic/src/AnthropicConfig.ts +84 -0
  750. package/repos/effect/packages/ai/anthropic/src/AnthropicError.ts +212 -0
  751. package/repos/effect/packages/ai/anthropic/src/AnthropicLanguageModel.ts +3098 -0
  752. package/repos/effect/packages/ai/anthropic/src/AnthropicTelemetry.ts +132 -0
  753. package/repos/effect/packages/ai/anthropic/src/AnthropicTool.ts +2512 -0
  754. package/repos/effect/packages/ai/anthropic/src/Generated.ts +12600 -0
  755. package/repos/effect/packages/ai/anthropic/src/index.ts +40 -0
  756. package/repos/effect/packages/ai/anthropic/src/internal/errors.ts +370 -0
  757. package/repos/effect/packages/ai/anthropic/src/internal/utilities.ts +26 -0
  758. package/repos/effect/packages/ai/anthropic/test/AnthropicLanguageModel.test.ts +300 -0
  759. package/repos/effect/packages/ai/anthropic/tsconfig.json +8 -0
  760. package/repos/effect/packages/ai/anthropic/vitest.config.ts +6 -0
  761. package/repos/effect/packages/ai/openai/CHANGELOG.md +668 -0
  762. package/repos/effect/packages/ai/openai/codegen.yaml +41 -0
  763. package/repos/effect/packages/ai/openai/docgen.json +24 -0
  764. package/repos/effect/packages/ai/openai/package.json +67 -0
  765. package/repos/effect/packages/ai/openai/src/Generated.ts +35774 -0
  766. package/repos/effect/packages/ai/openai/src/OpenAiClient.ts +730 -0
  767. package/repos/effect/packages/ai/openai/src/OpenAiClientGenerated.ts +202 -0
  768. package/repos/effect/packages/ai/openai/src/OpenAiConfig.ts +93 -0
  769. package/repos/effect/packages/ai/openai/src/OpenAiEmbeddingModel.ts +258 -0
  770. package/repos/effect/packages/ai/openai/src/OpenAiError.ts +242 -0
  771. package/repos/effect/packages/ai/openai/src/OpenAiLanguageModel.ts +3133 -0
  772. package/repos/effect/packages/ai/openai/src/OpenAiSchema.ts +1286 -0
  773. package/repos/effect/packages/ai/openai/src/OpenAiTelemetry.ts +162 -0
  774. package/repos/effect/packages/ai/openai/src/OpenAiTool.ts +342 -0
  775. package/repos/effect/packages/ai/openai/src/index.ts +55 -0
  776. package/repos/effect/packages/ai/openai/src/internal/errors.ts +349 -0
  777. package/repos/effect/packages/ai/openai/src/internal/utilities.ts +33 -0
  778. package/repos/effect/packages/ai/openai/test/OpenAiClient.test.ts +798 -0
  779. package/repos/effect/packages/ai/openai/test/OpenAiEmbeddingModel.test.ts +289 -0
  780. package/repos/effect/packages/ai/openai/test/OpenAiLanguageModel.test.ts +1528 -0
  781. package/repos/effect/packages/ai/openai/test/OpenAiSchema.test.ts +273 -0
  782. package/repos/effect/packages/ai/openai/tsconfig.json +8 -0
  783. package/repos/effect/packages/ai/openai/vitest.config.ts +6 -0
  784. package/repos/effect/packages/ai/openai-compat/CHANGELOG.md +626 -0
  785. package/repos/effect/packages/ai/openai-compat/docgen.json +24 -0
  786. package/repos/effect/packages/ai/openai-compat/package.json +69 -0
  787. package/repos/effect/packages/ai/openai-compat/src/OpenAiClient.ts +1221 -0
  788. package/repos/effect/packages/ai/openai-compat/src/OpenAiConfig.ts +87 -0
  789. package/repos/effect/packages/ai/openai-compat/src/OpenAiEmbeddingModel.ts +254 -0
  790. package/repos/effect/packages/ai/openai-compat/src/OpenAiError.ts +178 -0
  791. package/repos/effect/packages/ai/openai-compat/src/OpenAiLanguageModel.ts +1951 -0
  792. package/repos/effect/packages/ai/openai-compat/src/OpenAiTelemetry.ts +164 -0
  793. package/repos/effect/packages/ai/openai-compat/src/index.ts +35 -0
  794. package/repos/effect/packages/ai/openai-compat/src/internal/errors.ts +327 -0
  795. package/repos/effect/packages/ai/openai-compat/src/internal/utilities.ts +33 -0
  796. package/repos/effect/packages/ai/openai-compat/test/OpenAiClient.test.ts +474 -0
  797. package/repos/effect/packages/ai/openai-compat/test/OpenAiEmbeddingModel.test.ts +216 -0
  798. package/repos/effect/packages/ai/openai-compat/test/OpenAiLanguageModel.test.ts +1505 -0
  799. package/repos/effect/packages/ai/openai-compat/tsconfig.json +8 -0
  800. package/repos/effect/packages/ai/openai-compat/vitest.config.ts +6 -0
  801. package/repos/effect/packages/ai/openrouter/CHANGELOG.md +607 -0
  802. package/repos/effect/packages/ai/openrouter/codegen.yml +35 -0
  803. package/repos/effect/packages/ai/openrouter/docgen.json +24 -0
  804. package/repos/effect/packages/ai/openrouter/package.json +67 -0
  805. package/repos/effect/packages/ai/openrouter/src/Generated.ts +10028 -0
  806. package/repos/effect/packages/ai/openrouter/src/OpenRouterClient.ts +357 -0
  807. package/repos/effect/packages/ai/openrouter/src/OpenRouterConfig.ts +99 -0
  808. package/repos/effect/packages/ai/openrouter/src/OpenRouterError.ts +225 -0
  809. package/repos/effect/packages/ai/openrouter/src/OpenRouterLanguageModel.ts +1796 -0
  810. package/repos/effect/packages/ai/openrouter/src/index.ts +30 -0
  811. package/repos/effect/packages/ai/openrouter/src/internal/errors.ts +375 -0
  812. package/repos/effect/packages/ai/openrouter/src/internal/utilities.ts +92 -0
  813. package/repos/effect/packages/ai/openrouter/tsconfig.json +10 -0
  814. package/repos/effect/packages/ai/openrouter/vitest.config.ts +6 -0
  815. package/repos/effect/packages/atom/react/CHANGELOG.md +599 -0
  816. package/repos/effect/packages/atom/react/LICENSE +21 -0
  817. package/repos/effect/packages/atom/react/README.md +7 -0
  818. package/repos/effect/packages/atom/react/docgen.json +25 -0
  819. package/repos/effect/packages/atom/react/package.json +79 -0
  820. package/repos/effect/packages/atom/react/src/Hooks.ts +476 -0
  821. package/repos/effect/packages/atom/react/src/ReactHydration.ts +109 -0
  822. package/repos/effect/packages/atom/react/src/RegistryContext.ts +108 -0
  823. package/repos/effect/packages/atom/react/src/ScopedAtom.ts +151 -0
  824. package/repos/effect/packages/atom/react/src/index.ts +23 -0
  825. package/repos/effect/packages/atom/react/test/index.test.tsx +650 -0
  826. package/repos/effect/packages/atom/react/tsconfig.json +8 -0
  827. package/repos/effect/packages/atom/react/vitest.config.ts +9 -0
  828. package/repos/effect/packages/atom/react/vitest.setup.ts +8 -0
  829. package/repos/effect/packages/atom/solid/CHANGELOG.md +595 -0
  830. package/repos/effect/packages/atom/solid/LICENSE +21 -0
  831. package/repos/effect/packages/atom/solid/README.md +7 -0
  832. package/repos/effect/packages/atom/solid/docgen.json +26 -0
  833. package/repos/effect/packages/atom/solid/package.json +72 -0
  834. package/repos/effect/packages/atom/solid/src/Hooks.ts +359 -0
  835. package/repos/effect/packages/atom/solid/src/RegistryContext.ts +80 -0
  836. package/repos/effect/packages/atom/solid/src/index.ts +13 -0
  837. package/repos/effect/packages/atom/solid/test/index.test.tsx +296 -0
  838. package/repos/effect/packages/atom/solid/tsconfig.json +8 -0
  839. package/repos/effect/packages/atom/solid/vitest.config.ts +15 -0
  840. package/repos/effect/packages/atom/solid/vitest.setup.ts +8 -0
  841. package/repos/effect/packages/atom/vue/CHANGELOG.md +593 -0
  842. package/repos/effect/packages/atom/vue/LICENSE +21 -0
  843. package/repos/effect/packages/atom/vue/README.md +7 -0
  844. package/repos/effect/packages/atom/vue/docgen.json +24 -0
  845. package/repos/effect/packages/atom/vue/package.json +68 -0
  846. package/repos/effect/packages/atom/vue/src/index.ts +211 -0
  847. package/repos/effect/packages/atom/vue/test/index.test.ts +5 -0
  848. package/repos/effect/packages/atom/vue/tsconfig.json +14 -0
  849. package/repos/effect/packages/atom/vue/vitest.config.ts +8 -0
  850. package/repos/effect/packages/effect/CHANGELOG.md +1607 -0
  851. package/repos/effect/packages/effect/CONFIG.md +690 -0
  852. package/repos/effect/packages/effect/HTTPAPI.md +3213 -0
  853. package/repos/effect/packages/effect/LICENSE +21 -0
  854. package/repos/effect/packages/effect/MCP.md +369 -0
  855. package/repos/effect/packages/effect/OPTIC.md +620 -0
  856. package/repos/effect/packages/effect/README.md +53 -0
  857. package/repos/effect/packages/effect/SCHEMA.md +7284 -0
  858. package/repos/effect/packages/effect/benchmark/schema/Enums.ts +40 -0
  859. package/repos/effect/packages/effect/benchmark/schema/Optic.ts +79 -0
  860. package/repos/effect/packages/effect/benchmark/schema/array.ts +74 -0
  861. package/repos/effect/packages/effect/benchmark/schema/filter.ts +74 -0
  862. package/repos/effect/packages/effect/benchmark/schema/object.ts +82 -0
  863. package/repos/effect/packages/effect/benchmark/schema/tagged-union.ts +69 -0
  864. package/repos/effect/packages/effect/benchmark/schema/transformation.ts +91 -0
  865. package/repos/effect/packages/effect/benchmark/stream/splitLines.ts +46 -0
  866. package/repos/effect/packages/effect/docgen.json +38 -0
  867. package/repos/effect/packages/effect/package.json +127 -0
  868. package/repos/effect/packages/effect/src/Array.ts +4908 -0
  869. package/repos/effect/packages/effect/src/BigDecimal.ts +1943 -0
  870. package/repos/effect/packages/effect/src/BigInt.ts +1029 -0
  871. package/repos/effect/packages/effect/src/Boolean.ts +481 -0
  872. package/repos/effect/packages/effect/src/Brand.ts +318 -0
  873. package/repos/effect/packages/effect/src/Cache.ts +1295 -0
  874. package/repos/effect/packages/effect/src/Cause.ts +1939 -0
  875. package/repos/effect/packages/effect/src/Channel.ts +8615 -0
  876. package/repos/effect/packages/effect/src/ChannelSchema.ts +308 -0
  877. package/repos/effect/packages/effect/src/Chunk.ts +2976 -0
  878. package/repos/effect/packages/effect/src/Clock.ts +194 -0
  879. package/repos/effect/packages/effect/src/Combiner.ts +316 -0
  880. package/repos/effect/packages/effect/src/Config.ts +1416 -0
  881. package/repos/effect/packages/effect/src/ConfigProvider.ts +1159 -0
  882. package/repos/effect/packages/effect/src/Console.ts +653 -0
  883. package/repos/effect/packages/effect/src/Context.ts +1339 -0
  884. package/repos/effect/packages/effect/src/Cron.ts +1212 -0
  885. package/repos/effect/packages/effect/src/Crypto.ts +318 -0
  886. package/repos/effect/packages/effect/src/Data.ts +774 -0
  887. package/repos/effect/packages/effect/src/DateTime.ts +2922 -0
  888. package/repos/effect/packages/effect/src/Deferred.ts +917 -0
  889. package/repos/effect/packages/effect/src/Differ.ts +32 -0
  890. package/repos/effect/packages/effect/src/Duration.ts +1827 -0
  891. package/repos/effect/packages/effect/src/Effect.ts +15347 -0
  892. package/repos/effect/packages/effect/src/Effectable.ts +68 -0
  893. package/repos/effect/packages/effect/src/Encoding.ts +1046 -0
  894. package/repos/effect/packages/effect/src/Equal.ts +550 -0
  895. package/repos/effect/packages/effect/src/Equivalence.ts +870 -0
  896. package/repos/effect/packages/effect/src/ErrorReporter.ts +543 -0
  897. package/repos/effect/packages/effect/src/ExecutionPlan.ts +416 -0
  898. package/repos/effect/packages/effect/src/Exit.ts +1085 -0
  899. package/repos/effect/packages/effect/src/Fiber.ts +632 -0
  900. package/repos/effect/packages/effect/src/FiberHandle.ts +815 -0
  901. package/repos/effect/packages/effect/src/FiberMap.ts +1030 -0
  902. package/repos/effect/packages/effect/src/FiberSet.ts +713 -0
  903. package/repos/effect/packages/effect/src/FileSystem.ts +1394 -0
  904. package/repos/effect/packages/effect/src/Filter.ts +827 -0
  905. package/repos/effect/packages/effect/src/Formatter.ts +319 -0
  906. package/repos/effect/packages/effect/src/Function.ts +1415 -0
  907. package/repos/effect/packages/effect/src/Graph.ts +4892 -0
  908. package/repos/effect/packages/effect/src/HKT.ts +213 -0
  909. package/repos/effect/packages/effect/src/Hash.ts +539 -0
  910. package/repos/effect/packages/effect/src/HashMap.ts +1236 -0
  911. package/repos/effect/packages/effect/src/HashRing.ts +426 -0
  912. package/repos/effect/packages/effect/src/HashSet.ts +605 -0
  913. package/repos/effect/packages/effect/src/Inspectable.ts +329 -0
  914. package/repos/effect/packages/effect/src/Iterable.ts +2483 -0
  915. package/repos/effect/packages/effect/src/JsonPatch.ts +469 -0
  916. package/repos/effect/packages/effect/src/JsonPointer.ts +80 -0
  917. package/repos/effect/packages/effect/src/JsonSchema.ts +948 -0
  918. package/repos/effect/packages/effect/src/Latch.ts +373 -0
  919. package/repos/effect/packages/effect/src/Layer.ts +2773 -0
  920. package/repos/effect/packages/effect/src/LayerMap.ts +468 -0
  921. package/repos/effect/packages/effect/src/LogLevel.ts +412 -0
  922. package/repos/effect/packages/effect/src/Logger.ts +1284 -0
  923. package/repos/effect/packages/effect/src/ManagedRuntime.ts +381 -0
  924. package/repos/effect/packages/effect/src/Match.ts +2606 -0
  925. package/repos/effect/packages/effect/src/Metric.ts +4058 -0
  926. package/repos/effect/packages/effect/src/MutableHashMap.ts +845 -0
  927. package/repos/effect/packages/effect/src/MutableHashSet.ts +422 -0
  928. package/repos/effect/packages/effect/src/MutableList.ts +967 -0
  929. package/repos/effect/packages/effect/src/MutableRef.ts +822 -0
  930. package/repos/effect/packages/effect/src/Newtype.ts +319 -0
  931. package/repos/effect/packages/effect/src/NonEmptyIterable.ts +221 -0
  932. package/repos/effect/packages/effect/src/Number.ts +860 -0
  933. package/repos/effect/packages/effect/src/Optic.ts +1701 -0
  934. package/repos/effect/packages/effect/src/Option.ts +2664 -0
  935. package/repos/effect/packages/effect/src/Order.ts +982 -0
  936. package/repos/effect/packages/effect/src/Ordering.ts +182 -0
  937. package/repos/effect/packages/effect/src/PartitionedSemaphore.ts +561 -0
  938. package/repos/effect/packages/effect/src/Path.ts +870 -0
  939. package/repos/effect/packages/effect/src/Pipeable.ts +674 -0
  940. package/repos/effect/packages/effect/src/PlatformError.ts +221 -0
  941. package/repos/effect/packages/effect/src/Pool.ts +699 -0
  942. package/repos/effect/packages/effect/src/Predicate.ts +1872 -0
  943. package/repos/effect/packages/effect/src/PrimaryKey.ts +123 -0
  944. package/repos/effect/packages/effect/src/PubSub.ts +2797 -0
  945. package/repos/effect/packages/effect/src/Pull.ts +376 -0
  946. package/repos/effect/packages/effect/src/Queue.ts +1962 -0
  947. package/repos/effect/packages/effect/src/Random.ts +549 -0
  948. package/repos/effect/packages/effect/src/RcMap.ts +612 -0
  949. package/repos/effect/packages/effect/src/RcRef.ts +225 -0
  950. package/repos/effect/packages/effect/src/Record.ts +1563 -0
  951. package/repos/effect/packages/effect/src/Redactable.ts +168 -0
  952. package/repos/effect/packages/effect/src/Redacted.ts +314 -0
  953. package/repos/effect/packages/effect/src/Reducer.ts +178 -0
  954. package/repos/effect/packages/effect/src/Ref.ts +801 -0
  955. package/repos/effect/packages/effect/src/References.ts +786 -0
  956. package/repos/effect/packages/effect/src/RegExp.ts +82 -0
  957. package/repos/effect/packages/effect/src/Request.ts +598 -0
  958. package/repos/effect/packages/effect/src/RequestResolver.ts +1249 -0
  959. package/repos/effect/packages/effect/src/Resource.ts +184 -0
  960. package/repos/effect/packages/effect/src/Result.ts +1939 -0
  961. package/repos/effect/packages/effect/src/Runtime.ts +432 -0
  962. package/repos/effect/packages/effect/src/Schedule.ts +3564 -0
  963. package/repos/effect/packages/effect/src/Scheduler.ts +285 -0
  964. package/repos/effect/packages/effect/src/Schema.ts +14653 -0
  965. package/repos/effect/packages/effect/src/SchemaAST.ts +3903 -0
  966. package/repos/effect/packages/effect/src/SchemaGetter.ts +1870 -0
  967. package/repos/effect/packages/effect/src/SchemaIssue.ts +1176 -0
  968. package/repos/effect/packages/effect/src/SchemaParser.ts +1105 -0
  969. package/repos/effect/packages/effect/src/SchemaRepresentation.ts +3944 -0
  970. package/repos/effect/packages/effect/src/SchemaTransformation.ts +1818 -0
  971. package/repos/effect/packages/effect/src/SchemaUtils.ts +51 -0
  972. package/repos/effect/packages/effect/src/Scope.ts +572 -0
  973. package/repos/effect/packages/effect/src/ScopedCache.ts +820 -0
  974. package/repos/effect/packages/effect/src/ScopedRef.ts +192 -0
  975. package/repos/effect/packages/effect/src/Semaphore.ts +517 -0
  976. package/repos/effect/packages/effect/src/Sink.ts +2174 -0
  977. package/repos/effect/packages/effect/src/Stdio.ts +143 -0
  978. package/repos/effect/packages/effect/src/Stream.ts +11722 -0
  979. package/repos/effect/packages/effect/src/String.ts +1427 -0
  980. package/repos/effect/packages/effect/src/Struct.ts +979 -0
  981. package/repos/effect/packages/effect/src/SubscriptionRef.ts +1021 -0
  982. package/repos/effect/packages/effect/src/Symbol.ts +31 -0
  983. package/repos/effect/packages/effect/src/SynchronizedRef.ts +668 -0
  984. package/repos/effect/packages/effect/src/Take.ts +46 -0
  985. package/repos/effect/packages/effect/src/Terminal.ts +188 -0
  986. package/repos/effect/packages/effect/src/Tracer.ts +683 -0
  987. package/repos/effect/packages/effect/src/Trie.ts +953 -0
  988. package/repos/effect/packages/effect/src/Tuple.ts +737 -0
  989. package/repos/effect/packages/effect/src/TxChunk.ts +822 -0
  990. package/repos/effect/packages/effect/src/TxDeferred.ts +319 -0
  991. package/repos/effect/packages/effect/src/TxHashMap.ts +2165 -0
  992. package/repos/effect/packages/effect/src/TxHashSet.ts +908 -0
  993. package/repos/effect/packages/effect/src/TxPriorityQueue.ts +567 -0
  994. package/repos/effect/packages/effect/src/TxPubSub.ts +684 -0
  995. package/repos/effect/packages/effect/src/TxQueue.ts +1488 -0
  996. package/repos/effect/packages/effect/src/TxReentrantLock.ts +655 -0
  997. package/repos/effect/packages/effect/src/TxRef.ts +282 -0
  998. package/repos/effect/packages/effect/src/TxSemaphore.ts +707 -0
  999. package/repos/effect/packages/effect/src/TxSubscriptionRef.ts +518 -0
  1000. package/repos/effect/packages/effect/src/Types.ts +1121 -0
  1001. package/repos/effect/packages/effect/src/UndefinedOr.ts +239 -0
  1002. package/repos/effect/packages/effect/src/Unify.ts +314 -0
  1003. package/repos/effect/packages/effect/src/Utils.ts +221 -0
  1004. package/repos/effect/packages/effect/src/index.ts +712 -0
  1005. package/repos/effect/packages/effect/src/internal/array.ts +8 -0
  1006. package/repos/effect/packages/effect/src/internal/concurrency.ts +52 -0
  1007. package/repos/effect/packages/effect/src/internal/core.ts +666 -0
  1008. package/repos/effect/packages/effect/src/internal/dateTime.ts +1264 -0
  1009. package/repos/effect/packages/effect/src/internal/doNotation.ts +117 -0
  1010. package/repos/effect/packages/effect/src/internal/effect.ts +6427 -0
  1011. package/repos/effect/packages/effect/src/internal/equal.ts +28 -0
  1012. package/repos/effect/packages/effect/src/internal/errors.ts +9 -0
  1013. package/repos/effect/packages/effect/src/internal/executionPlan.ts +120 -0
  1014. package/repos/effect/packages/effect/src/internal/hashMap.ts +1309 -0
  1015. package/repos/effect/packages/effect/src/internal/hashSet.ts +190 -0
  1016. package/repos/effect/packages/effect/src/internal/layer.ts +88 -0
  1017. package/repos/effect/packages/effect/src/internal/matcher.ts +637 -0
  1018. package/repos/effect/packages/effect/src/internal/metric.ts +2 -0
  1019. package/repos/effect/packages/effect/src/internal/option.ts +98 -0
  1020. package/repos/effect/packages/effect/src/internal/random.ts +20 -0
  1021. package/repos/effect/packages/effect/src/internal/rcRef.ts +189 -0
  1022. package/repos/effect/packages/effect/src/internal/record.ts +18 -0
  1023. package/repos/effect/packages/effect/src/internal/redacted.ts +19 -0
  1024. package/repos/effect/packages/effect/src/internal/references.ts +72 -0
  1025. package/repos/effect/packages/effect/src/internal/request.ts +205 -0
  1026. package/repos/effect/packages/effect/src/internal/result.ts +112 -0
  1027. package/repos/effect/packages/effect/src/internal/schedule.ts +248 -0
  1028. package/repos/effect/packages/effect/src/internal/schema/annotations.ts +37 -0
  1029. package/repos/effect/packages/effect/src/internal/schema/arbitrary.ts +894 -0
  1030. package/repos/effect/packages/effect/src/internal/schema/cause.ts +26 -0
  1031. package/repos/effect/packages/effect/src/internal/schema/equivalence.ts +154 -0
  1032. package/repos/effect/packages/effect/src/internal/schema/representation.ts +799 -0
  1033. package/repos/effect/packages/effect/src/internal/schema/schema.ts +128 -0
  1034. package/repos/effect/packages/effect/src/internal/stream.ts +28 -0
  1035. package/repos/effect/packages/effect/src/internal/tracer.ts +41 -0
  1036. package/repos/effect/packages/effect/src/internal/trie.ts +733 -0
  1037. package/repos/effect/packages/effect/src/internal/version.ts +2 -0
  1038. package/repos/effect/packages/effect/src/testing/FastCheck.ts +89 -0
  1039. package/repos/effect/packages/effect/src/testing/TestClock.ts +547 -0
  1040. package/repos/effect/packages/effect/src/testing/TestConsole.ts +369 -0
  1041. package/repos/effect/packages/effect/src/testing/TestSchema.ts +567 -0
  1042. package/repos/effect/packages/effect/src/testing/index.ts +25 -0
  1043. package/repos/effect/packages/effect/src/unstable/ai/AiError.ts +1629 -0
  1044. package/repos/effect/packages/effect/src/unstable/ai/AnthropicStructuredOutput.ts +407 -0
  1045. package/repos/effect/packages/effect/src/unstable/ai/Chat.ts +931 -0
  1046. package/repos/effect/packages/effect/src/unstable/ai/EmbeddingModel.ts +269 -0
  1047. package/repos/effect/packages/effect/src/unstable/ai/IdGenerator.ts +300 -0
  1048. package/repos/effect/packages/effect/src/unstable/ai/LanguageModel.ts +2221 -0
  1049. package/repos/effect/packages/effect/src/unstable/ai/McpSchema.ts +2527 -0
  1050. package/repos/effect/packages/effect/src/unstable/ai/McpServer.ts +1468 -0
  1051. package/repos/effect/packages/effect/src/unstable/ai/Model.ts +166 -0
  1052. package/repos/effect/packages/effect/src/unstable/ai/OpenAiStructuredOutput.ts +476 -0
  1053. package/repos/effect/packages/effect/src/unstable/ai/Prompt.ts +2234 -0
  1054. package/repos/effect/packages/effect/src/unstable/ai/Response.ts +2582 -0
  1055. package/repos/effect/packages/effect/src/unstable/ai/ResponseIdTracker.ts +139 -0
  1056. package/repos/effect/packages/effect/src/unstable/ai/Telemetry.ts +515 -0
  1057. package/repos/effect/packages/effect/src/unstable/ai/Tokenizer.ts +176 -0
  1058. package/repos/effect/packages/effect/src/unstable/ai/Tool.ts +2003 -0
  1059. package/repos/effect/packages/effect/src/unstable/ai/Toolkit.ts +554 -0
  1060. package/repos/effect/packages/effect/src/unstable/ai/index.ts +90 -0
  1061. package/repos/effect/packages/effect/src/unstable/ai/internal/codec-transformer.ts +13 -0
  1062. package/repos/effect/packages/effect/src/unstable/cli/Argument.ts +749 -0
  1063. package/repos/effect/packages/effect/src/unstable/cli/CliError.ts +549 -0
  1064. package/repos/effect/packages/effect/src/unstable/cli/CliOutput.ts +607 -0
  1065. package/repos/effect/packages/effect/src/unstable/cli/Command.ts +1610 -0
  1066. package/repos/effect/packages/effect/src/unstable/cli/Completions.ts +123 -0
  1067. package/repos/effect/packages/effect/src/unstable/cli/Flag.ts +986 -0
  1068. package/repos/effect/packages/effect/src/unstable/cli/GlobalFlag.ts +295 -0
  1069. package/repos/effect/packages/effect/src/unstable/cli/HelpDoc.ts +323 -0
  1070. package/repos/effect/packages/effect/src/unstable/cli/Param.ts +2193 -0
  1071. package/repos/effect/packages/effect/src/unstable/cli/Primitive.ts +766 -0
  1072. package/repos/effect/packages/effect/src/unstable/cli/Prompt.ts +3852 -0
  1073. package/repos/effect/packages/effect/src/unstable/cli/SEMANTICS.md +157 -0
  1074. package/repos/effect/packages/effect/src/unstable/cli/index.ts +60 -0
  1075. package/repos/effect/packages/effect/src/unstable/cli/internal/ansi.ts +152 -0
  1076. package/repos/effect/packages/effect/src/unstable/cli/internal/auto-suggest.ts +41 -0
  1077. package/repos/effect/packages/effect/src/unstable/cli/internal/command.ts +340 -0
  1078. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/bash.ts +222 -0
  1079. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/descriptor.ts +133 -0
  1080. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/fish.ts +253 -0
  1081. package/repos/effect/packages/effect/src/unstable/cli/internal/completions/zsh.ts +220 -0
  1082. package/repos/effect/packages/effect/src/unstable/cli/internal/config.ts +272 -0
  1083. package/repos/effect/packages/effect/src/unstable/cli/internal/help.ts +181 -0
  1084. package/repos/effect/packages/effect/src/unstable/cli/internal/lexer.ts +70 -0
  1085. package/repos/effect/packages/effect/src/unstable/cli/internal/parser.ts +932 -0
  1086. package/repos/effect/packages/effect/src/unstable/cluster/ClusterCron.ts +163 -0
  1087. package/repos/effect/packages/effect/src/unstable/cluster/ClusterError.ts +238 -0
  1088. package/repos/effect/packages/effect/src/unstable/cluster/ClusterMetrics.ts +112 -0
  1089. package/repos/effect/packages/effect/src/unstable/cluster/ClusterSchema.ts +170 -0
  1090. package/repos/effect/packages/effect/src/unstable/cluster/ClusterWorkflowEngine.ts +778 -0
  1091. package/repos/effect/packages/effect/src/unstable/cluster/DeliverAt.ts +58 -0
  1092. package/repos/effect/packages/effect/src/unstable/cluster/Entity.ts +779 -0
  1093. package/repos/effect/packages/effect/src/unstable/cluster/EntityAddress.ts +93 -0
  1094. package/repos/effect/packages/effect/src/unstable/cluster/EntityId.ts +50 -0
  1095. package/repos/effect/packages/effect/src/unstable/cluster/EntityProxy.ts +263 -0
  1096. package/repos/effect/packages/effect/src/unstable/cluster/EntityProxyServer.ts +149 -0
  1097. package/repos/effect/packages/effect/src/unstable/cluster/EntityResource.ts +184 -0
  1098. package/repos/effect/packages/effect/src/unstable/cluster/EntityType.ts +52 -0
  1099. package/repos/effect/packages/effect/src/unstable/cluster/Envelope.ts +433 -0
  1100. package/repos/effect/packages/effect/src/unstable/cluster/HttpRunner.ts +345 -0
  1101. package/repos/effect/packages/effect/src/unstable/cluster/K8sHttpClient.ts +297 -0
  1102. package/repos/effect/packages/effect/src/unstable/cluster/MachineId.ts +54 -0
  1103. package/repos/effect/packages/effect/src/unstable/cluster/Message.ts +314 -0
  1104. package/repos/effect/packages/effect/src/unstable/cluster/MessageStorage.ts +1072 -0
  1105. package/repos/effect/packages/effect/src/unstable/cluster/Reply.ts +455 -0
  1106. package/repos/effect/packages/effect/src/unstable/cluster/Runner.ts +129 -0
  1107. package/repos/effect/packages/effect/src/unstable/cluster/RunnerAddress.ts +112 -0
  1108. package/repos/effect/packages/effect/src/unstable/cluster/RunnerHealth.ts +145 -0
  1109. package/repos/effect/packages/effect/src/unstable/cluster/RunnerServer.ts +220 -0
  1110. package/repos/effect/packages/effect/src/unstable/cluster/RunnerStorage.ts +243 -0
  1111. package/repos/effect/packages/effect/src/unstable/cluster/Runners.ts +690 -0
  1112. package/repos/effect/packages/effect/src/unstable/cluster/ShardId.ts +178 -0
  1113. package/repos/effect/packages/effect/src/unstable/cluster/Sharding.ts +1488 -0
  1114. package/repos/effect/packages/effect/src/unstable/cluster/ShardingConfig.ts +367 -0
  1115. package/repos/effect/packages/effect/src/unstable/cluster/ShardingRegistrationEvent.ts +76 -0
  1116. package/repos/effect/packages/effect/src/unstable/cluster/SingleRunner.ts +75 -0
  1117. package/repos/effect/packages/effect/src/unstable/cluster/Singleton.ts +56 -0
  1118. package/repos/effect/packages/effect/src/unstable/cluster/SingletonAddress.ts +49 -0
  1119. package/repos/effect/packages/effect/src/unstable/cluster/Snowflake.ts +282 -0
  1120. package/repos/effect/packages/effect/src/unstable/cluster/SocketRunner.ts +96 -0
  1121. package/repos/effect/packages/effect/src/unstable/cluster/SqlMessageStorage.ts +1045 -0
  1122. package/repos/effect/packages/effect/src/unstable/cluster/SqlRunnerStorage.ts +700 -0
  1123. package/repos/effect/packages/effect/src/unstable/cluster/TestRunner.ts +36 -0
  1124. package/repos/effect/packages/effect/src/unstable/cluster/index.ts +195 -0
  1125. package/repos/effect/packages/effect/src/unstable/cluster/internal/entityManager.ts +678 -0
  1126. package/repos/effect/packages/effect/src/unstable/cluster/internal/entityReaper.ts +58 -0
  1127. package/repos/effect/packages/effect/src/unstable/cluster/internal/hash.ts +23 -0
  1128. package/repos/effect/packages/effect/src/unstable/cluster/internal/interruptors.ts +2 -0
  1129. package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceMap.ts +100 -0
  1130. package/repos/effect/packages/effect/src/unstable/cluster/internal/resourceRef.ts +99 -0
  1131. package/repos/effect/packages/effect/src/unstable/devtools/DevTools.ts +68 -0
  1132. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsClient.ts +236 -0
  1133. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsSchema.ts +558 -0
  1134. package/repos/effect/packages/effect/src/unstable/devtools/DevToolsServer.ts +94 -0
  1135. package/repos/effect/packages/effect/src/unstable/devtools/index.ts +25 -0
  1136. package/repos/effect/packages/effect/src/unstable/encoding/Msgpack.ts +383 -0
  1137. package/repos/effect/packages/effect/src/unstable/encoding/Ndjson.ts +602 -0
  1138. package/repos/effect/packages/effect/src/unstable/encoding/Sse.ts +593 -0
  1139. package/repos/effect/packages/effect/src/unstable/encoding/index.ts +20 -0
  1140. package/repos/effect/packages/effect/src/unstable/eventlog/Event.ts +447 -0
  1141. package/repos/effect/packages/effect/src/unstable/eventlog/EventGroup.ts +193 -0
  1142. package/repos/effect/packages/effect/src/unstable/eventlog/EventJournal.ts +795 -0
  1143. package/repos/effect/packages/effect/src/unstable/eventlog/EventLog.ts +1030 -0
  1144. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogEncryption.ts +169 -0
  1145. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogMessage.ts +354 -0
  1146. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogRemote.ts +377 -0
  1147. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServer.ts +242 -0
  1148. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerEncrypted.ts +268 -0
  1149. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogServerUnencrypted.ts +898 -0
  1150. package/repos/effect/packages/effect/src/unstable/eventlog/EventLogSessionAuth.ts +524 -0
  1151. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventJournal.ts +353 -0
  1152. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerEncrypted.ts +343 -0
  1153. package/repos/effect/packages/effect/src/unstable/eventlog/SqlEventLogServerUnencrypted.ts +527 -0
  1154. package/repos/effect/packages/effect/src/unstable/eventlog/index.ts +75 -0
  1155. package/repos/effect/packages/effect/src/unstable/eventlog/internal/identityRootSecretDerivation.ts +153 -0
  1156. package/repos/effect/packages/effect/src/unstable/http/Cookies.ts +952 -0
  1157. package/repos/effect/packages/effect/src/unstable/http/Etag.ts +141 -0
  1158. package/repos/effect/packages/effect/src/unstable/http/FetchHttpClient.ts +123 -0
  1159. package/repos/effect/packages/effect/src/unstable/http/FindMyWay.ts +15 -0
  1160. package/repos/effect/packages/effect/src/unstable/http/Headers.ts +438 -0
  1161. package/repos/effect/packages/effect/src/unstable/http/HttpBody.ts +545 -0
  1162. package/repos/effect/packages/effect/src/unstable/http/HttpClient.ts +1630 -0
  1163. package/repos/effect/packages/effect/src/unstable/http/HttpClientError.ts +328 -0
  1164. package/repos/effect/packages/effect/src/unstable/http/HttpClientRequest.ts +968 -0
  1165. package/repos/effect/packages/effect/src/unstable/http/HttpClientResponse.ts +408 -0
  1166. package/repos/effect/packages/effect/src/unstable/http/HttpEffect.ts +400 -0
  1167. package/repos/effect/packages/effect/src/unstable/http/HttpIncomingMessage.ts +153 -0
  1168. package/repos/effect/packages/effect/src/unstable/http/HttpMethod.ts +124 -0
  1169. package/repos/effect/packages/effect/src/unstable/http/HttpMiddleware.ts +394 -0
  1170. package/repos/effect/packages/effect/src/unstable/http/HttpPlatform.ts +165 -0
  1171. package/repos/effect/packages/effect/src/unstable/http/HttpRouter.ts +1341 -0
  1172. package/repos/effect/packages/effect/src/unstable/http/HttpServer.ts +329 -0
  1173. package/repos/effect/packages/effect/src/unstable/http/HttpServerError.ts +374 -0
  1174. package/repos/effect/packages/effect/src/unstable/http/HttpServerRequest.ts +1081 -0
  1175. package/repos/effect/packages/effect/src/unstable/http/HttpServerRespondable.ts +115 -0
  1176. package/repos/effect/packages/effect/src/unstable/http/HttpServerResponse.ts +1381 -0
  1177. package/repos/effect/packages/effect/src/unstable/http/HttpStaticServer.ts +464 -0
  1178. package/repos/effect/packages/effect/src/unstable/http/HttpTraceContext.ts +160 -0
  1179. package/repos/effect/packages/effect/src/unstable/http/Multipart.ts +830 -0
  1180. package/repos/effect/packages/effect/src/unstable/http/Multipasta/HeadersParser.ts +14 -0
  1181. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Node.ts +14 -0
  1182. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Search.ts +14 -0
  1183. package/repos/effect/packages/effect/src/unstable/http/Multipasta/Web.ts +14 -0
  1184. package/repos/effect/packages/effect/src/unstable/http/Multipasta.ts +15 -0
  1185. package/repos/effect/packages/effect/src/unstable/http/Template.ts +262 -0
  1186. package/repos/effect/packages/effect/src/unstable/http/Url.ts +330 -0
  1187. package/repos/effect/packages/effect/src/unstable/http/UrlParams.ts +678 -0
  1188. package/repos/effect/packages/effect/src/unstable/http/index.ts +145 -0
  1189. package/repos/effect/packages/effect/src/unstable/http/internal/preResponseHandler.ts +15 -0
  1190. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApi.ts +316 -0
  1191. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiBuilder.ts +1015 -0
  1192. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiClient.ts +1005 -0
  1193. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiEndpoint.ts +1545 -0
  1194. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiError.ts +443 -0
  1195. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiGroup.ts +381 -0
  1196. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiMiddleware.ts +478 -0
  1197. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiScalar.ts +267 -0
  1198. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSchema.ts +733 -0
  1199. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSecurity.ts +244 -0
  1200. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiSwagger.ts +68 -0
  1201. package/repos/effect/packages/effect/src/unstable/httpapi/HttpApiTest.ts +112 -0
  1202. package/repos/effect/packages/effect/src/unstable/httpapi/OpenApi.ts +1098 -0
  1203. package/repos/effect/packages/effect/src/unstable/httpapi/index.ts +70 -0
  1204. package/repos/effect/packages/effect/src/unstable/httpapi/internal/html.ts +18 -0
  1205. package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiScalar.ts +5 -0
  1206. package/repos/effect/packages/effect/src/unstable/httpapi/internal/httpApiSwagger.ts +9 -0
  1207. package/repos/effect/packages/effect/src/unstable/observability/Otlp.ts +172 -0
  1208. package/repos/effect/packages/effect/src/unstable/observability/OtlpExporter.ts +149 -0
  1209. package/repos/effect/packages/effect/src/unstable/observability/OtlpLogger.ts +340 -0
  1210. package/repos/effect/packages/effect/src/unstable/observability/OtlpMetrics.ts +826 -0
  1211. package/repos/effect/packages/effect/src/unstable/observability/OtlpResource.ts +288 -0
  1212. package/repos/effect/packages/effect/src/unstable/observability/OtlpSerialization.ts +66 -0
  1213. package/repos/effect/packages/effect/src/unstable/observability/OtlpTracer.ts +442 -0
  1214. package/repos/effect/packages/effect/src/unstable/observability/PrometheusMetrics.ts +468 -0
  1215. package/repos/effect/packages/effect/src/unstable/observability/index.ts +45 -0
  1216. package/repos/effect/packages/effect/src/unstable/observability/internal/otlpEnv.ts +39 -0
  1217. package/repos/effect/packages/effect/src/unstable/observability/internal/otlpProtobuf.ts +779 -0
  1218. package/repos/effect/packages/effect/src/unstable/observability/internal/protobuf.ts +262 -0
  1219. package/repos/effect/packages/effect/src/unstable/persistence/KeyValueStore.ts +864 -0
  1220. package/repos/effect/packages/effect/src/unstable/persistence/Persistable.ts +252 -0
  1221. package/repos/effect/packages/effect/src/unstable/persistence/PersistedCache.ts +111 -0
  1222. package/repos/effect/packages/effect/src/unstable/persistence/PersistedQueue.ts +1196 -0
  1223. package/repos/effect/packages/effect/src/unstable/persistence/Persistence.ts +1071 -0
  1224. package/repos/effect/packages/effect/src/unstable/persistence/RateLimiter.ts +748 -0
  1225. package/repos/effect/packages/effect/src/unstable/persistence/Redis.ts +188 -0
  1226. package/repos/effect/packages/effect/src/unstable/persistence/index.ts +40 -0
  1227. package/repos/effect/packages/effect/src/unstable/process/ChildProcess.ts +1036 -0
  1228. package/repos/effect/packages/effect/src/unstable/process/ChildProcessSpawner.ts +285 -0
  1229. package/repos/effect/packages/effect/src/unstable/process/index.ts +15 -0
  1230. package/repos/effect/packages/effect/src/unstable/reactivity/AsyncResult.ts +1081 -0
  1231. package/repos/effect/packages/effect/src/unstable/reactivity/Atom.ts +2520 -0
  1232. package/repos/effect/packages/effect/src/unstable/reactivity/AtomHttpApi.ts +352 -0
  1233. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRef.ts +352 -0
  1234. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRegistry.ts +1127 -0
  1235. package/repos/effect/packages/effect/src/unstable/reactivity/AtomRpc.ts +305 -0
  1236. package/repos/effect/packages/effect/src/unstable/reactivity/Hydration.ts +155 -0
  1237. package/repos/effect/packages/effect/src/unstable/reactivity/Reactivity.ts +348 -0
  1238. package/repos/effect/packages/effect/src/unstable/reactivity/index.ts +45 -0
  1239. package/repos/effect/packages/effect/src/unstable/rpc/Rpc.ts +1255 -0
  1240. package/repos/effect/packages/effect/src/unstable/rpc/RpcClient.ts +1370 -0
  1241. package/repos/effect/packages/effect/src/unstable/rpc/RpcClientError.ts +57 -0
  1242. package/repos/effect/packages/effect/src/unstable/rpc/RpcGroup.ts +409 -0
  1243. package/repos/effect/packages/effect/src/unstable/rpc/RpcMessage.ts +402 -0
  1244. package/repos/effect/packages/effect/src/unstable/rpc/RpcMiddleware.ts +344 -0
  1245. package/repos/effect/packages/effect/src/unstable/rpc/RpcSchema.ts +97 -0
  1246. package/repos/effect/packages/effect/src/unstable/rpc/RpcSerialization.ts +546 -0
  1247. package/repos/effect/packages/effect/src/unstable/rpc/RpcServer.ts +1492 -0
  1248. package/repos/effect/packages/effect/src/unstable/rpc/RpcTest.ts +56 -0
  1249. package/repos/effect/packages/effect/src/unstable/rpc/RpcWorker.ts +118 -0
  1250. package/repos/effect/packages/effect/src/unstable/rpc/Utils.ts +120 -0
  1251. package/repos/effect/packages/effect/src/unstable/rpc/index.ts +65 -0
  1252. package/repos/effect/packages/effect/src/unstable/schema/Model.ts +862 -0
  1253. package/repos/effect/packages/effect/src/unstable/schema/VariantSchema.ts +604 -0
  1254. package/repos/effect/packages/effect/src/unstable/schema/index.ts +15 -0
  1255. package/repos/effect/packages/effect/src/unstable/socket/Socket.ts +911 -0
  1256. package/repos/effect/packages/effect/src/unstable/socket/SocketServer.ts +147 -0
  1257. package/repos/effect/packages/effect/src/unstable/socket/index.ts +15 -0
  1258. package/repos/effect/packages/effect/src/unstable/sql/Migrator.ts +440 -0
  1259. package/repos/effect/packages/effect/src/unstable/sql/SqlClient.ts +342 -0
  1260. package/repos/effect/packages/effect/src/unstable/sql/SqlConnection.ts +83 -0
  1261. package/repos/effect/packages/effect/src/unstable/sql/SqlError.ts +590 -0
  1262. package/repos/effect/packages/effect/src/unstable/sql/SqlModel.ts +359 -0
  1263. package/repos/effect/packages/effect/src/unstable/sql/SqlResolver.ts +380 -0
  1264. package/repos/effect/packages/effect/src/unstable/sql/SqlSchema.ts +172 -0
  1265. package/repos/effect/packages/effect/src/unstable/sql/SqlStream.ts +81 -0
  1266. package/repos/effect/packages/effect/src/unstable/sql/Statement.ts +1500 -0
  1267. package/repos/effect/packages/effect/src/unstable/sql/index.ts +50 -0
  1268. package/repos/effect/packages/effect/src/unstable/workers/Transferable.ts +191 -0
  1269. package/repos/effect/packages/effect/src/unstable/workers/Worker.ts +245 -0
  1270. package/repos/effect/packages/effect/src/unstable/workers/WorkerError.ts +148 -0
  1271. package/repos/effect/packages/effect/src/unstable/workers/WorkerRunner.ts +57 -0
  1272. package/repos/effect/packages/effect/src/unstable/workers/index.ts +25 -0
  1273. package/repos/effect/packages/effect/src/unstable/workflow/Activity.ts +322 -0
  1274. package/repos/effect/packages/effect/src/unstable/workflow/DurableClock.ts +117 -0
  1275. package/repos/effect/packages/effect/src/unstable/workflow/DurableDeferred.ts +653 -0
  1276. package/repos/effect/packages/effect/src/unstable/workflow/DurableQueue.ts +360 -0
  1277. package/repos/effect/packages/effect/src/unstable/workflow/Workflow.ts +898 -0
  1278. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowEngine.ts +759 -0
  1279. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxy.ts +212 -0
  1280. package/repos/effect/packages/effect/src/unstable/workflow/WorkflowProxyServer.ts +151 -0
  1281. package/repos/effect/packages/effect/src/unstable/workflow/index.ts +45 -0
  1282. package/repos/effect/packages/effect/src/unstable/workflow/internal/crypto.ts +15 -0
  1283. package/repos/effect/packages/effect/test/Array.test.ts +1579 -0
  1284. package/repos/effect/packages/effect/test/AtomRef.test.ts +27 -0
  1285. package/repos/effect/packages/effect/test/BigDecimal.test.ts +525 -0
  1286. package/repos/effect/packages/effect/test/BigInt.test.ts +57 -0
  1287. package/repos/effect/packages/effect/test/Boolean.test.ts +289 -0
  1288. package/repos/effect/packages/effect/test/Brand.test.ts +160 -0
  1289. package/repos/effect/packages/effect/test/Cache.test.ts +1423 -0
  1290. package/repos/effect/packages/effect/test/Cause.test.ts +834 -0
  1291. package/repos/effect/packages/effect/test/Channel.test.ts +556 -0
  1292. package/repos/effect/packages/effect/test/Chunk.test.ts +874 -0
  1293. package/repos/effect/packages/effect/test/Combiner.test.ts +42 -0
  1294. package/repos/effect/packages/effect/test/Config.test.ts +1416 -0
  1295. package/repos/effect/packages/effect/test/ConfigProvider.test.ts +726 -0
  1296. package/repos/effect/packages/effect/test/Cron.test.ts +401 -0
  1297. package/repos/effect/packages/effect/test/Crypto.test.ts +86 -0
  1298. package/repos/effect/packages/effect/test/Data.test.ts +269 -0
  1299. package/repos/effect/packages/effect/test/DateTime.test.ts +953 -0
  1300. package/repos/effect/packages/effect/test/Deferred.test.ts +165 -0
  1301. package/repos/effect/packages/effect/test/Duration.test.ts +679 -0
  1302. package/repos/effect/packages/effect/test/Effect.test.ts +2658 -0
  1303. package/repos/effect/packages/effect/test/EffectEager.test.ts +678 -0
  1304. package/repos/effect/packages/effect/test/EffectKeepAlive.test.ts +71 -0
  1305. package/repos/effect/packages/effect/test/Equal.test.ts +1278 -0
  1306. package/repos/effect/packages/effect/test/Equivalence.test.ts +170 -0
  1307. package/repos/effect/packages/effect/test/ExecutionPlan.test.ts +117 -0
  1308. package/repos/effect/packages/effect/test/Exit.test.ts +12 -0
  1309. package/repos/effect/packages/effect/test/Fiber.test.ts +9 -0
  1310. package/repos/effect/packages/effect/test/FiberHandle.test.ts +146 -0
  1311. package/repos/effect/packages/effect/test/FiberMap.test.ts +171 -0
  1312. package/repos/effect/packages/effect/test/FiberSet.test.ts +119 -0
  1313. package/repos/effect/packages/effect/test/Formatter.test.ts +247 -0
  1314. package/repos/effect/packages/effect/test/Function.test.ts +333 -0
  1315. package/repos/effect/packages/effect/test/Graph.test.ts +3505 -0
  1316. package/repos/effect/packages/effect/test/HashMap.test.ts +618 -0
  1317. package/repos/effect/packages/effect/test/HashSet.test.ts +298 -0
  1318. package/repos/effect/packages/effect/test/HttpClient.test.ts +131 -0
  1319. package/repos/effect/packages/effect/test/Iterable.test.ts +486 -0
  1320. package/repos/effect/packages/effect/test/JsonPatch.test.ts +948 -0
  1321. package/repos/effect/packages/effect/test/JsonPointer.test.ts +353 -0
  1322. package/repos/effect/packages/effect/test/JsonSchema.test.ts +1253 -0
  1323. package/repos/effect/packages/effect/test/Latch.test.ts +21 -0
  1324. package/repos/effect/packages/effect/test/Layer.test.ts +648 -0
  1325. package/repos/effect/packages/effect/test/LayerMap.test.ts +98 -0
  1326. package/repos/effect/packages/effect/test/LogLevel.test.ts +28 -0
  1327. package/repos/effect/packages/effect/test/Logger.test.ts +154 -0
  1328. package/repos/effect/packages/effect/test/ManagedRuntime.test.ts +58 -0
  1329. package/repos/effect/packages/effect/test/Match.test.ts +27 -0
  1330. package/repos/effect/packages/effect/test/Metric.test.ts +682 -0
  1331. package/repos/effect/packages/effect/test/Migrator.test.ts +69 -0
  1332. package/repos/effect/packages/effect/test/MutableHashMap.test.ts +309 -0
  1333. package/repos/effect/packages/effect/test/MutableHashSet.test.ts +10 -0
  1334. package/repos/effect/packages/effect/test/MutableList.test.ts +58 -0
  1335. package/repos/effect/packages/effect/test/Newtype.test.ts +90 -0
  1336. package/repos/effect/packages/effect/test/Number.test.ts +422 -0
  1337. package/repos/effect/packages/effect/test/Optic.test.ts +452 -0
  1338. package/repos/effect/packages/effect/test/Option.test.ts +564 -0
  1339. package/repos/effect/packages/effect/test/Order.test.ts +163 -0
  1340. package/repos/effect/packages/effect/test/Ordering.test.ts +18 -0
  1341. package/repos/effect/packages/effect/test/PartitionedSemaphore.test.ts +74 -0
  1342. package/repos/effect/packages/effect/test/Pathfinding.test.ts +426 -0
  1343. package/repos/effect/packages/effect/test/Pool.test.ts +422 -0
  1344. package/repos/effect/packages/effect/test/Predicate.test.ts +555 -0
  1345. package/repos/effect/packages/effect/test/PubSub.test.ts +538 -0
  1346. package/repos/effect/packages/effect/test/Queue.test.ts +317 -0
  1347. package/repos/effect/packages/effect/test/Random.test.ts +238 -0
  1348. package/repos/effect/packages/effect/test/RcMap.test.ts +237 -0
  1349. package/repos/effect/packages/effect/test/RcRef.test.ts +97 -0
  1350. package/repos/effect/packages/effect/test/Record.test.ts +395 -0
  1351. package/repos/effect/packages/effect/test/Redacted.test.ts +59 -0
  1352. package/repos/effect/packages/effect/test/Reducer.test.ts +12 -0
  1353. package/repos/effect/packages/effect/test/Ref.test.ts +187 -0
  1354. package/repos/effect/packages/effect/test/Request.test.ts +305 -0
  1355. package/repos/effect/packages/effect/test/Resource.test.ts +59 -0
  1356. package/repos/effect/packages/effect/test/Result.test.ts +517 -0
  1357. package/repos/effect/packages/effect/test/Schedule.test.ts +395 -0
  1358. package/repos/effect/packages/effect/test/Scheduler.test.ts +70 -0
  1359. package/repos/effect/packages/effect/test/Scope.test.ts +19 -0
  1360. package/repos/effect/packages/effect/test/ScopedCache.test.ts +2316 -0
  1361. package/repos/effect/packages/effect/test/ScopedRef.test.ts +80 -0
  1362. package/repos/effect/packages/effect/test/Semaphore.test.ts +469 -0
  1363. package/repos/effect/packages/effect/test/Sink.test.ts +230 -0
  1364. package/repos/effect/packages/effect/test/Stream.test.ts +4712 -0
  1365. package/repos/effect/packages/effect/test/String.test.ts +690 -0
  1366. package/repos/effect/packages/effect/test/Struct.test.ts +216 -0
  1367. package/repos/effect/packages/effect/test/SubscriptionRef.test.ts +90 -0
  1368. package/repos/effect/packages/effect/test/Symbol.test.ts +50 -0
  1369. package/repos/effect/packages/effect/test/SynchronizedRef.test.ts +105 -0
  1370. package/repos/effect/packages/effect/test/TestClock.test.ts +71 -0
  1371. package/repos/effect/packages/effect/test/Tracer.test.ts +410 -0
  1372. package/repos/effect/packages/effect/test/Trie.test.ts +531 -0
  1373. package/repos/effect/packages/effect/test/Tuple.test.ts +127 -0
  1374. package/repos/effect/packages/effect/test/TxChunk.test.ts +342 -0
  1375. package/repos/effect/packages/effect/test/TxDeferred.test.ts +197 -0
  1376. package/repos/effect/packages/effect/test/TxHashMap.test.ts +963 -0
  1377. package/repos/effect/packages/effect/test/TxHashSet.test.ts +442 -0
  1378. package/repos/effect/packages/effect/test/TxPriorityQueue.test.ts +187 -0
  1379. package/repos/effect/packages/effect/test/TxPubSub.test.ts +391 -0
  1380. package/repos/effect/packages/effect/test/TxQueue.test.ts +1260 -0
  1381. package/repos/effect/packages/effect/test/TxReentrantLock.test.ts +413 -0
  1382. package/repos/effect/packages/effect/test/TxSemaphore.test.ts +283 -0
  1383. package/repos/effect/packages/effect/test/TxSubscriptionRef.test.ts +197 -0
  1384. package/repos/effect/packages/effect/test/UndefinedOr.test.ts +65 -0
  1385. package/repos/effect/packages/effect/test/cluster/ClusterWorkflowEngine.test.ts +652 -0
  1386. package/repos/effect/packages/effect/test/cluster/Entity.test.ts +81 -0
  1387. package/repos/effect/packages/effect/test/cluster/K8sHttpClient.test.ts +34 -0
  1388. package/repos/effect/packages/effect/test/cluster/MessageStorage.test.ts +196 -0
  1389. package/repos/effect/packages/effect/test/cluster/Sharding.test.ts +578 -0
  1390. package/repos/effect/packages/effect/test/cluster/TestEntity.ts +132 -0
  1391. package/repos/effect/packages/effect/test/reactivity/AsyncResult.test.ts +41 -0
  1392. package/repos/effect/packages/effect/test/reactivity/Atom.test.ts +2551 -0
  1393. package/repos/effect/packages/effect/test/reactivity/AtomHttpApi.test.ts +86 -0
  1394. package/repos/effect/packages/effect/test/reactivity/AtomRpc.test.ts +70 -0
  1395. package/repos/effect/packages/effect/test/rpc/Rpc.test.ts +73 -0
  1396. package/repos/effect/packages/effect/test/rpc/RpcClient.test.ts +58 -0
  1397. package/repos/effect/packages/effect/test/rpc/RpcSerialization.test.ts +171 -0
  1398. package/repos/effect/packages/effect/test/schema/HMR.test.ts +72 -0
  1399. package/repos/effect/packages/effect/test/schema/Schema.test.ts +9133 -0
  1400. package/repos/effect/packages/effect/test/schema/SchemaAST.test.ts +280 -0
  1401. package/repos/effect/packages/effect/test/schema/SchemaGetter.test.ts +383 -0
  1402. package/repos/effect/packages/effect/test/schema/SchemaIssue.test.ts +9 -0
  1403. package/repos/effect/packages/effect/test/schema/SchemaParser.test.ts +323 -0
  1404. package/repos/effect/packages/effect/test/schema/fixtures/HMR-Class.ts +5 -0
  1405. package/repos/effect/packages/effect/test/schema/fixtures/HMR-sanity-check.ts +3 -0
  1406. package/repos/effect/packages/effect/test/schema/representation/fromASTs.test.ts +820 -0
  1407. package/repos/effect/packages/effect/test/schema/representation/fromJsonSchemaDocument.test.ts +2137 -0
  1408. package/repos/effect/packages/effect/test/schema/representation/toCodeDocument.test.ts +2089 -0
  1409. package/repos/effect/packages/effect/test/schema/representation/toJsonSchemaMultiDocument.test.ts +39 -0
  1410. package/repos/effect/packages/effect/test/schema/representation/toSchema.test.ts +506 -0
  1411. package/repos/effect/packages/effect/test/schema/toArbitrary.test.ts +1693 -0
  1412. package/repos/effect/packages/effect/test/schema/toCodec.test.ts +3149 -0
  1413. package/repos/effect/packages/effect/test/schema/toDifferJsonPatch.test.ts +239 -0
  1414. package/repos/effect/packages/effect/test/schema/toEquivalence.test.ts +519 -0
  1415. package/repos/effect/packages/effect/test/schema/toFormatter.test.ts +565 -0
  1416. package/repos/effect/packages/effect/test/schema/toIso.test.ts +394 -0
  1417. package/repos/effect/packages/effect/test/schema/toJsonSchemaDocument.test.ts +3630 -0
  1418. package/repos/effect/packages/effect/test/schema/toStandardJSONSchemaV1.test.ts +126 -0
  1419. package/repos/effect/packages/effect/test/schema/toStandardSchemaV1.test.ts +495 -0
  1420. package/repos/effect/packages/effect/test/schema/v3-v4.test.ts +250 -0
  1421. package/repos/effect/packages/effect/test/testing/TestSchema.test.ts +78 -0
  1422. package/repos/effect/packages/effect/test/unstable/ai/AiError.test.ts +823 -0
  1423. package/repos/effect/packages/effect/test/unstable/ai/AnthropicStructuredOutput.test.ts +593 -0
  1424. package/repos/effect/packages/effect/test/unstable/ai/Chat.test.ts +147 -0
  1425. package/repos/effect/packages/effect/test/unstable/ai/EmbeddingModel.test.ts +185 -0
  1426. package/repos/effect/packages/effect/test/unstable/ai/LanguageModel.test.ts +1714 -0
  1427. package/repos/effect/packages/effect/test/unstable/ai/LanguageModelTrackerLifecycle.test.ts +413 -0
  1428. package/repos/effect/packages/effect/test/unstable/ai/McpServer.test.ts +82 -0
  1429. package/repos/effect/packages/effect/test/unstable/ai/Model.test.ts +16 -0
  1430. package/repos/effect/packages/effect/test/unstable/ai/OpenAiStructuredOutput.test.ts +723 -0
  1431. package/repos/effect/packages/effect/test/unstable/ai/Prompt.test.ts +346 -0
  1432. package/repos/effect/packages/effect/test/unstable/ai/ResponseIdTracker.test.ts +424 -0
  1433. package/repos/effect/packages/effect/test/unstable/ai/Tool.test.ts +1264 -0
  1434. package/repos/effect/packages/effect/test/unstable/ai/utils.ts +68 -0
  1435. package/repos/effect/packages/effect/test/unstable/cli/Arguments.test.ts +390 -0
  1436. package/repos/effect/packages/effect/test/unstable/cli/Command.test.ts +1801 -0
  1437. package/repos/effect/packages/effect/test/unstable/cli/Errors.test.ts +150 -0
  1438. package/repos/effect/packages/effect/test/unstable/cli/Help.test.ts +572 -0
  1439. package/repos/effect/packages/effect/test/unstable/cli/LogLevel.test.ts +202 -0
  1440. package/repos/effect/packages/effect/test/unstable/cli/Param.test.ts +391 -0
  1441. package/repos/effect/packages/effect/test/unstable/cli/Primitive.test.ts +321 -0
  1442. package/repos/effect/packages/effect/test/unstable/cli/Prompt.test.ts +597 -0
  1443. package/repos/effect/packages/effect/test/unstable/cli/completions/completions.test.ts +656 -0
  1444. package/repos/effect/packages/effect/test/unstable/cli/completions/descriptor.test.ts +245 -0
  1445. package/repos/effect/packages/effect/test/unstable/cli/fixtures/ComprehensiveCli.ts +422 -0
  1446. package/repos/effect/packages/effect/test/unstable/cli/services/MockTerminal.ts +135 -0
  1447. package/repos/effect/packages/effect/test/unstable/cli/services/TestActions.ts +36 -0
  1448. package/repos/effect/packages/effect/test/unstable/encoding/Ndjson.test.ts +18 -0
  1449. package/repos/effect/packages/effect/test/unstable/encoding/Sse.test.ts +62 -0
  1450. package/repos/effect/packages/effect/test/unstable/eventlog/EventJournal.test.ts +25 -0
  1451. package/repos/effect/packages/effect/test/unstable/eventlog/EventLog.test.ts +104 -0
  1452. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogIdentityDerivation.test.ts +85 -0
  1453. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogRemote.test.ts +176 -0
  1454. package/repos/effect/packages/effect/test/unstable/eventlog/EventLogSessionAuth.test.ts +130 -0
  1455. package/repos/effect/packages/effect/test/unstable/eventlog/SqlEventLogServerUnencryptedStorageTest.ts +169 -0
  1456. package/repos/effect/packages/effect/test/unstable/http/Cookies.test.ts +80 -0
  1457. package/repos/effect/packages/effect/test/unstable/http/Headers.test.ts +73 -0
  1458. package/repos/effect/packages/effect/test/unstable/http/HttpClient.test.ts +306 -0
  1459. package/repos/effect/packages/effect/test/unstable/http/HttpClientRequest.test.ts +164 -0
  1460. package/repos/effect/packages/effect/test/unstable/http/HttpEffect.test.ts +254 -0
  1461. package/repos/effect/packages/effect/test/unstable/http/HttpMiddleware.test.ts +57 -0
  1462. package/repos/effect/packages/effect/test/unstable/http/HttpServerError.test.ts +121 -0
  1463. package/repos/effect/packages/effect/test/unstable/http/HttpServerRequest.test.ts +157 -0
  1464. package/repos/effect/packages/effect/test/unstable/http/HttpServerResponse.test.ts +76 -0
  1465. package/repos/effect/packages/effect/test/unstable/http/Multipart.test.ts +69 -0
  1466. package/repos/effect/packages/effect/test/unstable/http/Url.test.ts +98 -0
  1467. package/repos/effect/packages/effect/test/unstable/http/UrlParams.test.ts +30 -0
  1468. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiBuilder.test.ts +186 -0
  1469. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiClient.test.ts +446 -0
  1470. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiEndpoint.test.ts +160 -0
  1471. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSchema.test.ts +108 -0
  1472. package/repos/effect/packages/effect/test/unstable/httpapi/HttpApiSecurity.test.ts +41 -0
  1473. package/repos/effect/packages/effect/test/unstable/httpapi/OpenApi.test.ts +39 -0
  1474. package/repos/effect/packages/effect/test/unstable/observability/OtlpConfig.test.ts +151 -0
  1475. package/repos/effect/packages/effect/test/unstable/observability/OtlpExporter.test.ts +108 -0
  1476. package/repos/effect/packages/effect/test/unstable/observability/OtlpMetrics.test.ts +518 -0
  1477. package/repos/effect/packages/effect/test/unstable/observability/OtlpResource.test.ts +84 -0
  1478. package/repos/effect/packages/effect/test/unstable/observability/PrometheusMetrics.test.ts +417 -0
  1479. package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStore.test.ts +164 -0
  1480. package/repos/effect/packages/effect/test/unstable/persistence/KeyValueStoreTest.ts +85 -0
  1481. package/repos/effect/packages/effect/test/unstable/persistence/PersistedCache.test.ts +4 -0
  1482. package/repos/effect/packages/effect/test/unstable/persistence/PersistedCacheTest.ts +111 -0
  1483. package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueue.test.ts +4 -0
  1484. package/repos/effect/packages/effect/test/unstable/persistence/PersistedQueueTest.ts +106 -0
  1485. package/repos/effect/packages/effect/test/unstable/persistence/RateLimiter.test.ts +145 -0
  1486. package/repos/effect/packages/effect/test/unstable/persistence/Redis.test.ts +43 -0
  1487. package/repos/effect/packages/effect/test/unstable/process/ChildProcess.test.ts +352 -0
  1488. package/repos/effect/packages/effect/test/unstable/schema/VariantSchema.test.ts +72 -0
  1489. package/repos/effect/packages/effect/test/unstable/sql/SqlError.test.ts +228 -0
  1490. package/repos/effect/packages/effect/test/unstable/sql/SqlSchema.test.ts +168 -0
  1491. package/repos/effect/packages/effect/test/unstable/workers/WorkerError.test.ts +90 -0
  1492. package/repos/effect/packages/effect/test/unstable/workflow/DurableQueue.test.ts +105 -0
  1493. package/repos/effect/packages/effect/test/unstable/workflow/WorkflowEngine.test.ts +60 -0
  1494. package/repos/effect/packages/effect/test/utils/assert.ts +182 -0
  1495. package/repos/effect/packages/effect/test/utils/chunkCoordination.ts +36 -0
  1496. package/repos/effect/packages/effect/test/utils/counter.ts +54 -0
  1497. package/repos/effect/packages/effect/tsconfig.json +8 -0
  1498. package/repos/effect/packages/effect/typetest/AiError.tst.ts +49 -0
  1499. package/repos/effect/packages/effect/typetest/Array.tst.ts +1289 -0
  1500. package/repos/effect/packages/effect/typetest/Brand.tst.ts +51 -0
  1501. package/repos/effect/packages/effect/typetest/Channel.tst.ts +112 -0
  1502. package/repos/effect/packages/effect/typetest/Config.tst.ts +31 -0
  1503. package/repos/effect/packages/effect/typetest/Data.tst.ts +121 -0
  1504. package/repos/effect/packages/effect/typetest/Effect.tst.ts +976 -0
  1505. package/repos/effect/packages/effect/typetest/Equivalence.tst.ts +19 -0
  1506. package/repos/effect/packages/effect/typetest/Newtype.tst.ts +72 -0
  1507. package/repos/effect/packages/effect/typetest/Optic.tst.ts +130 -0
  1508. package/repos/effect/packages/effect/typetest/Option.tst.ts +72 -0
  1509. package/repos/effect/packages/effect/typetest/Order.tst.ts +19 -0
  1510. package/repos/effect/packages/effect/typetest/Predicate.tst.ts +251 -0
  1511. package/repos/effect/packages/effect/typetest/Result.tst.ts +353 -0
  1512. package/repos/effect/packages/effect/typetest/Schedule.tst.ts +21 -0
  1513. package/repos/effect/packages/effect/typetest/Stream.tst.ts +197 -0
  1514. package/repos/effect/packages/effect/typetest/Struct.tst.ts +422 -0
  1515. package/repos/effect/packages/effect/typetest/Tuple.tst.ts +177 -0
  1516. package/repos/effect/packages/effect/typetest/Types.tst.ts +364 -0
  1517. package/repos/effect/packages/effect/typetest/VariantSchema.tst.ts +76 -0
  1518. package/repos/effect/packages/effect/typetest/schema/Array.tst.ts +46 -0
  1519. package/repos/effect/packages/effect/typetest/schema/Literals.tst.ts +58 -0
  1520. package/repos/effect/packages/effect/typetest/schema/Record.tst.ts +145 -0
  1521. package/repos/effect/packages/effect/typetest/schema/Schema.tst.ts +1854 -0
  1522. package/repos/effect/packages/effect/typetest/schema/Struct.tst.ts +745 -0
  1523. package/repos/effect/packages/effect/typetest/schema/Tuple.tst.ts +199 -0
  1524. package/repos/effect/packages/effect/typetest/schema/Union.tst.ts +198 -0
  1525. package/repos/effect/packages/effect/typetest/schema/api.tst.ts +276 -0
  1526. package/repos/effect/packages/effect/typetest/schema/toArbitrary.tst.ts +65 -0
  1527. package/repos/effect/packages/effect/typetest/schema/toIso.tst.ts +282 -0
  1528. package/repos/effect/packages/effect/typetest/unstable/ai/LanguageModel.tst.ts +191 -0
  1529. package/repos/effect/packages/effect/typetest/unstable/ai/Tool.tst.ts +33 -0
  1530. package/repos/effect/packages/effect/typetest/unstable/cli/Command.tst.ts +124 -0
  1531. package/repos/effect/packages/effect/typetest/unstable/cli/Param.tst.ts +20 -0
  1532. package/repos/effect/packages/effect/typetest/unstable/cli/Prompt.tst.ts +97 -0
  1533. package/repos/effect/packages/effect/typetest/unstable/encoding/Ndjson.tst.ts +24 -0
  1534. package/repos/effect/packages/effect/typetest/unstable/http/HttpClient.tst.ts +143 -0
  1535. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiBuilder.tst.ts +98 -0
  1536. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiClient.tst.ts +677 -0
  1537. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiEndpoint.tst.ts +466 -0
  1538. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiMiddleware.tst.ts +90 -0
  1539. package/repos/effect/packages/effect/typetest/unstable/httpapi/HttpApiSchema.tst.ts +135 -0
  1540. package/repos/effect/packages/effect/typetest/unstable/reactivity/AsyncResult.tst.ts +65 -0
  1541. package/repos/effect/packages/effect/typetest/unstable/reactivity/AtomHttpApi.tst.ts +63 -0
  1542. package/repos/effect/packages/effect/typetest/unstable/rpc/Rpc.tst.ts +74 -0
  1543. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcGroup.tst.ts +61 -0
  1544. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcMiddleware.tst.ts +41 -0
  1545. package/repos/effect/packages/effect/typetest/unstable/rpc/RpcServer.tst.ts +26 -0
  1546. package/repos/effect/packages/effect/typetest/unstable/sql/SqlSchema.tst.ts +75 -0
  1547. package/repos/effect/packages/effect/typetest/unstable/workflow/Workflow.tst.ts +16 -0
  1548. package/repos/effect/packages/effect/vitest.config.ts +11 -0
  1549. package/repos/effect/packages/opentelemetry/CHANGELOG.md +620 -0
  1550. package/repos/effect/packages/opentelemetry/LICENSE +21 -0
  1551. package/repos/effect/packages/opentelemetry/README.md +5 -0
  1552. package/repos/effect/packages/opentelemetry/docgen.json +30 -0
  1553. package/repos/effect/packages/opentelemetry/package.json +126 -0
  1554. package/repos/effect/packages/opentelemetry/src/Logger.ts +193 -0
  1555. package/repos/effect/packages/opentelemetry/src/Metrics.ts +138 -0
  1556. package/repos/effect/packages/opentelemetry/src/NodeSdk.ts +162 -0
  1557. package/repos/effect/packages/opentelemetry/src/Resource.ts +147 -0
  1558. package/repos/effect/packages/opentelemetry/src/Tracer.ts +594 -0
  1559. package/repos/effect/packages/opentelemetry/src/WebSdk.ts +140 -0
  1560. package/repos/effect/packages/opentelemetry/src/index.ts +35 -0
  1561. package/repos/effect/packages/opentelemetry/src/internal/attributes.ts +28 -0
  1562. package/repos/effect/packages/opentelemetry/src/internal/metrics.ts +463 -0
  1563. package/repos/effect/packages/opentelemetry/src/internal/utilities.ts +5 -0
  1564. package/repos/effect/packages/opentelemetry/test/Logger.test.ts +122 -0
  1565. package/repos/effect/packages/opentelemetry/test/Metrics.test.ts +339 -0
  1566. package/repos/effect/packages/opentelemetry/test/Tracer.test.ts +167 -0
  1567. package/repos/effect/packages/opentelemetry/tsconfig.json +8 -0
  1568. package/repos/effect/packages/opentelemetry/vitest.config.ts +6 -0
  1569. package/repos/effect/packages/platform-browser/CHANGELOG.md +637 -0
  1570. package/repos/effect/packages/platform-browser/LICENSE +21 -0
  1571. package/repos/effect/packages/platform-browser/README.md +1 -0
  1572. package/repos/effect/packages/platform-browser/docgen.json +21 -0
  1573. package/repos/effect/packages/platform-browser/package.json +74 -0
  1574. package/repos/effect/packages/platform-browser/src/BrowserCrypto.ts +97 -0
  1575. package/repos/effect/packages/platform-browser/src/BrowserHttpClient.ts +430 -0
  1576. package/repos/effect/packages/platform-browser/src/BrowserKeyValueStore.ts +177 -0
  1577. package/repos/effect/packages/platform-browser/src/BrowserPersistence.ts +334 -0
  1578. package/repos/effect/packages/platform-browser/src/BrowserRuntime.ts +53 -0
  1579. package/repos/effect/packages/platform-browser/src/BrowserSocket.ts +52 -0
  1580. package/repos/effect/packages/platform-browser/src/BrowserStream.ts +56 -0
  1581. package/repos/effect/packages/platform-browser/src/BrowserWorker.ts +98 -0
  1582. package/repos/effect/packages/platform-browser/src/BrowserWorkerRunner.ts +199 -0
  1583. package/repos/effect/packages/platform-browser/src/Clipboard.ts +143 -0
  1584. package/repos/effect/packages/platform-browser/src/Geolocation.ts +233 -0
  1585. package/repos/effect/packages/platform-browser/src/IndexedDb.ts +113 -0
  1586. package/repos/effect/packages/platform-browser/src/IndexedDbDatabase.ts +648 -0
  1587. package/repos/effect/packages/platform-browser/src/IndexedDbQueryBuilder.ts +2032 -0
  1588. package/repos/effect/packages/platform-browser/src/IndexedDbTable.ts +260 -0
  1589. package/repos/effect/packages/platform-browser/src/IndexedDbVersion.ts +138 -0
  1590. package/repos/effect/packages/platform-browser/src/Permissions.ts +146 -0
  1591. package/repos/effect/packages/platform-browser/src/index.ts +90 -0
  1592. package/repos/effect/packages/platform-browser/test/BrowserCrypto.test.ts +74 -0
  1593. package/repos/effect/packages/platform-browser/test/BrowserHttpClient.test.ts +91 -0
  1594. package/repos/effect/packages/platform-browser/test/BrowserKeyValueStore.test.ts +23 -0
  1595. package/repos/effect/packages/platform-browser/test/BrowserPersistence.test.ts +209 -0
  1596. package/repos/effect/packages/platform-browser/test/BrowserPersistencePersistedCache.test.ts +29 -0
  1597. package/repos/effect/packages/platform-browser/test/IndexedDbDatabase.test.ts +253 -0
  1598. package/repos/effect/packages/platform-browser/test/IndexedDbQueryBuilder.test.ts +1459 -0
  1599. package/repos/effect/packages/platform-browser/test/IndexedDbTable.test.ts +101 -0
  1600. package/repos/effect/packages/platform-browser/test/IndexedDbVersion.test.ts +50 -0
  1601. package/repos/effect/packages/platform-browser/test/Permissions.test.ts +12 -0
  1602. package/repos/effect/packages/platform-browser/test/RpcWorker.test.ts +19 -0
  1603. package/repos/effect/packages/platform-browser/test/fixtures/rpc-e2e.ts +141 -0
  1604. package/repos/effect/packages/platform-browser/test/fixtures/rpc-schemas.ts +157 -0
  1605. package/repos/effect/packages/platform-browser/test/fixtures/rpc-worker.ts +12 -0
  1606. package/repos/effect/packages/platform-browser/tsconfig.json +8 -0
  1607. package/repos/effect/packages/platform-browser/vitest.config.ts +17 -0
  1608. package/repos/effect/packages/platform-browser/vitest.setup.ts +5 -0
  1609. package/repos/effect/packages/platform-bun/CHANGELOG.md +691 -0
  1610. package/repos/effect/packages/platform-bun/LICENSE +21 -0
  1611. package/repos/effect/packages/platform-bun/README.md +7 -0
  1612. package/repos/effect/packages/platform-bun/docgen.json +20 -0
  1613. package/repos/effect/packages/platform-bun/package.json +73 -0
  1614. package/repos/effect/packages/platform-bun/src/BunChildProcessSpawner.ts +6 -0
  1615. package/repos/effect/packages/platform-bun/src/BunClusterHttp.ts +174 -0
  1616. package/repos/effect/packages/platform-bun/src/BunClusterSocket.ts +153 -0
  1617. package/repos/effect/packages/platform-bun/src/BunCrypto.ts +24 -0
  1618. package/repos/effect/packages/platform-bun/src/BunFileSystem.ts +20 -0
  1619. package/repos/effect/packages/platform-bun/src/BunHttpClient.ts +9 -0
  1620. package/repos/effect/packages/platform-bun/src/BunHttpPlatform.ts +50 -0
  1621. package/repos/effect/packages/platform-bun/src/BunHttpServer.ts +600 -0
  1622. package/repos/effect/packages/platform-bun/src/BunHttpServerRequest.ts +19 -0
  1623. package/repos/effect/packages/platform-bun/src/BunMultipart.ts +54 -0
  1624. package/repos/effect/packages/platform-bun/src/BunPath.ts +37 -0
  1625. package/repos/effect/packages/platform-bun/src/BunRedis.ts +88 -0
  1626. package/repos/effect/packages/platform-bun/src/BunRuntime.ts +52 -0
  1627. package/repos/effect/packages/platform-bun/src/BunServices.ts +49 -0
  1628. package/repos/effect/packages/platform-bun/src/BunSink.ts +8 -0
  1629. package/repos/effect/packages/platform-bun/src/BunSocket.ts +54 -0
  1630. package/repos/effect/packages/platform-bun/src/BunSocketServer.ts +8 -0
  1631. package/repos/effect/packages/platform-bun/src/BunStdio.ts +22 -0
  1632. package/repos/effect/packages/platform-bun/src/BunStream.ts +68 -0
  1633. package/repos/effect/packages/platform-bun/src/BunTerminal.ts +32 -0
  1634. package/repos/effect/packages/platform-bun/src/BunWorker.ts +92 -0
  1635. package/repos/effect/packages/platform-bun/src/BunWorkerRunner.ts +113 -0
  1636. package/repos/effect/packages/platform-bun/src/index.ts +115 -0
  1637. package/repos/effect/packages/platform-bun/tsconfig.json +12 -0
  1638. package/repos/effect/packages/platform-node/CHANGELOG.md +695 -0
  1639. package/repos/effect/packages/platform-node/LICENSE +21 -0
  1640. package/repos/effect/packages/platform-node/README.md +7 -0
  1641. package/repos/effect/packages/platform-node/docgen.json +24 -0
  1642. package/repos/effect/packages/platform-node/package.json +82 -0
  1643. package/repos/effect/packages/platform-node/src/Mime.ts +25 -0
  1644. package/repos/effect/packages/platform-node/src/NodeChildProcessSpawner.ts +6 -0
  1645. package/repos/effect/packages/platform-node/src/NodeClusterHttp.ts +155 -0
  1646. package/repos/effect/packages/platform-node/src/NodeClusterSocket.ts +176 -0
  1647. package/repos/effect/packages/platform-node/src/NodeCrypto.ts +24 -0
  1648. package/repos/effect/packages/platform-node/src/NodeFileSystem.ts +21 -0
  1649. package/repos/effect/packages/platform-node/src/NodeHttpClient.ts +664 -0
  1650. package/repos/effect/packages/platform-node/src/NodeHttpIncomingMessage.ts +141 -0
  1651. package/repos/effect/packages/platform-node/src/NodeHttpPlatform.ts +70 -0
  1652. package/repos/effect/packages/platform-node/src/NodeHttpServer.ts +646 -0
  1653. package/repos/effect/packages/platform-node/src/NodeHttpServerRequest.ts +33 -0
  1654. package/repos/effect/packages/platform-node/src/NodeMultipart.ts +183 -0
  1655. package/repos/effect/packages/platform-node/src/NodePath.ts +40 -0
  1656. package/repos/effect/packages/platform-node/src/NodeRedis.ts +92 -0
  1657. package/repos/effect/packages/platform-node/src/NodeRuntime.ts +53 -0
  1658. package/repos/effect/packages/platform-node/src/NodeServices.ts +50 -0
  1659. package/repos/effect/packages/platform-node/src/NodeSink.ts +8 -0
  1660. package/repos/effect/packages/platform-node/src/NodeSocket.ts +72 -0
  1661. package/repos/effect/packages/platform-node/src/NodeSocketServer.ts +8 -0
  1662. package/repos/effect/packages/platform-node/src/NodeStdio.ts +22 -0
  1663. package/repos/effect/packages/platform-node/src/NodeStream.ts +8 -0
  1664. package/repos/effect/packages/platform-node/src/NodeTerminal.ts +32 -0
  1665. package/repos/effect/packages/platform-node/src/NodeWorker.ts +121 -0
  1666. package/repos/effect/packages/platform-node/src/NodeWorkerRunner.ts +110 -0
  1667. package/repos/effect/packages/platform-node/src/Undici.ts +29 -0
  1668. package/repos/effect/packages/platform-node/src/index.ts +130 -0
  1669. package/repos/effect/packages/platform-node/test/HttpApi.test.ts +1831 -0
  1670. package/repos/effect/packages/platform-node/test/HttpStaticServer.test.ts +253 -0
  1671. package/repos/effect/packages/platform-node/test/HttpStaticServerConditional.test.ts +296 -0
  1672. package/repos/effect/packages/platform-node/test/NodeCrypto.test.ts +59 -0
  1673. package/repos/effect/packages/platform-node/test/NodeHttpClient.test.ts +157 -0
  1674. package/repos/effect/packages/platform-node/test/NodeHttpPlatform.test.ts +51 -0
  1675. package/repos/effect/packages/platform-node/test/NodeHttpServer.test.ts +598 -0
  1676. package/repos/effect/packages/platform-node/test/NodeRedis.test.ts +31 -0
  1677. package/repos/effect/packages/platform-node/test/NodeSocket.test.ts +153 -0
  1678. package/repos/effect/packages/platform-node/test/OpenApi.test.ts +1573 -0
  1679. package/repos/effect/packages/platform-node/test/RpcServer.test.ts +213 -0
  1680. package/repos/effect/packages/platform-node/test/__snapshots__/HttpApi.test.ts.snap +715 -0
  1681. package/repos/effect/packages/platform-node/test/cluster/MessageStorageTest.ts +196 -0
  1682. package/repos/effect/packages/platform-node/test/cluster/SocketRunner.test.ts +120 -0
  1683. package/repos/effect/packages/platform-node/test/cluster/SqlMessageStorage.test.ts +222 -0
  1684. package/repos/effect/packages/platform-node/test/cluster/SqlRunnerStorage.test.ts +101 -0
  1685. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/conditional.txt +1 -0
  1686. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/custom/home.html +1 -0
  1687. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/file.binx +1 -0
  1688. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/guide/index.html +1 -0
  1689. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/hello.txt +1 -0
  1690. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/index.html +1 -0
  1691. package/repos/effect/packages/platform-node/test/fixtures/http-static-server/range.txt +1 -0
  1692. package/repos/effect/packages/platform-node/test/fixtures/http-static-server-outside.txt +1 -0
  1693. package/repos/effect/packages/platform-node/test/fixtures/mysql2-utils.ts +64 -0
  1694. package/repos/effect/packages/platform-node/test/fixtures/pg-utils.ts +39 -0
  1695. package/repos/effect/packages/platform-node/test/fixtures/rpc-e2e.ts +149 -0
  1696. package/repos/effect/packages/platform-node/test/fixtures/rpc-schemas.ts +175 -0
  1697. package/repos/effect/packages/platform-node/test/fixtures/text.txt +1 -0
  1698. package/repos/effect/packages/platform-node/tsconfig.json +12 -0
  1699. package/repos/effect/packages/platform-node/vitest.config.ts +6 -0
  1700. package/repos/effect/packages/platform-node-shared/CHANGELOG.md +617 -0
  1701. package/repos/effect/packages/platform-node-shared/LICENSE +21 -0
  1702. package/repos/effect/packages/platform-node-shared/README.md +7 -0
  1703. package/repos/effect/packages/platform-node-shared/docgen.json +38 -0
  1704. package/repos/effect/packages/platform-node-shared/package.json +76 -0
  1705. package/repos/effect/packages/platform-node-shared/src/NodeChildProcessSpawner.ts +713 -0
  1706. package/repos/effect/packages/platform-node-shared/src/NodeClusterSocket.ts +70 -0
  1707. package/repos/effect/packages/platform-node-shared/src/NodeCrypto.ts +60 -0
  1708. package/repos/effect/packages/platform-node-shared/src/NodeFileSystem.ts +652 -0
  1709. package/repos/effect/packages/platform-node-shared/src/NodePath.ts +80 -0
  1710. package/repos/effect/packages/platform-node-shared/src/NodeRuntime.ts +59 -0
  1711. package/repos/effect/packages/platform-node-shared/src/NodeSink.ts +116 -0
  1712. package/repos/effect/packages/platform-node-shared/src/NodeSocket.ts +269 -0
  1713. package/repos/effect/packages/platform-node-shared/src/NodeSocketServer.ts +301 -0
  1714. package/repos/effect/packages/platform-node-shared/src/NodeStdio.ts +67 -0
  1715. package/repos/effect/packages/platform-node-shared/src/NodeStream.ts +445 -0
  1716. package/repos/effect/packages/platform-node-shared/src/NodeTerminal.ts +129 -0
  1717. package/repos/effect/packages/platform-node-shared/src/index.ts +65 -0
  1718. package/repos/effect/packages/platform-node-shared/src/internal/utils.ts +51 -0
  1719. package/repos/effect/packages/platform-node-shared/test/NodeChildProcessSpawner.test.ts +1069 -0
  1720. package/repos/effect/packages/platform-node-shared/test/NodeFileSystem.test.ts +214 -0
  1721. package/repos/effect/packages/platform-node-shared/test/NodeSink.test.ts +153 -0
  1722. package/repos/effect/packages/platform-node-shared/test/NodeStream.test.ts +173 -0
  1723. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/no-permissions.sh +3 -0
  1724. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/parent-exits-early.sh +31 -0
  1725. package/repos/effect/packages/platform-node-shared/test/fixtures/bash/spawn-children.sh +32 -0
  1726. package/repos/effect/packages/platform-node-shared/test/fixtures/config/SHOUTING +1 -0
  1727. package/repos/effect/packages/platform-node-shared/test/fixtures/config/integer +1 -0
  1728. package/repos/effect/packages/platform-node-shared/test/fixtures/config/nested/config +1 -0
  1729. package/repos/effect/packages/platform-node-shared/test/fixtures/config/secret +1 -0
  1730. package/repos/effect/packages/platform-node-shared/test/fixtures/helloworld.tar.gz +0 -0
  1731. package/repos/effect/packages/platform-node-shared/test/fixtures/text.txt +1 -0
  1732. package/repos/effect/packages/platform-node-shared/tsconfig.json +11 -0
  1733. package/repos/effect/packages/platform-node-shared/vitest.config.ts +6 -0
  1734. package/repos/effect/packages/sql/clickhouse/CHANGELOG.md +681 -0
  1735. package/repos/effect/packages/sql/clickhouse/LICENSE +21 -0
  1736. package/repos/effect/packages/sql/clickhouse/README.md +7 -0
  1737. package/repos/effect/packages/sql/clickhouse/docgen.json +24 -0
  1738. package/repos/effect/packages/sql/clickhouse/package.json +72 -0
  1739. package/repos/effect/packages/sql/clickhouse/src/ClickhouseClient.ts +546 -0
  1740. package/repos/effect/packages/sql/clickhouse/src/ClickhouseMigrator.ts +51 -0
  1741. package/repos/effect/packages/sql/clickhouse/src/index.ts +15 -0
  1742. package/repos/effect/packages/sql/clickhouse/test/Client.test.ts +6 -0
  1743. package/repos/effect/packages/sql/clickhouse/test/SqlErrorClassification.test.ts +75 -0
  1744. package/repos/effect/packages/sql/clickhouse/tsconfig.json +12 -0
  1745. package/repos/effect/packages/sql/clickhouse/vitest.config.ts +6 -0
  1746. package/repos/effect/packages/sql/d1/CHANGELOG.md +597 -0
  1747. package/repos/effect/packages/sql/d1/LICENSE +21 -0
  1748. package/repos/effect/packages/sql/d1/README.md +7 -0
  1749. package/repos/effect/packages/sql/d1/docgen.json +24 -0
  1750. package/repos/effect/packages/sql/d1/package.json +75 -0
  1751. package/repos/effect/packages/sql/d1/src/D1Client.ts +249 -0
  1752. package/repos/effect/packages/sql/d1/src/index.ts +10 -0
  1753. package/repos/effect/packages/sql/d1/test/Client.test.ts +65 -0
  1754. package/repos/effect/packages/sql/d1/test/Resolver.test.ts +176 -0
  1755. package/repos/effect/packages/sql/d1/test/utils.ts +38 -0
  1756. package/repos/effect/packages/sql/d1/tsconfig.json +8 -0
  1757. package/repos/effect/packages/sql/d1/vitest.config.ts +6 -0
  1758. package/repos/effect/packages/sql/libsql/CHANGELOG.md +601 -0
  1759. package/repos/effect/packages/sql/libsql/LICENSE +21 -0
  1760. package/repos/effect/packages/sql/libsql/README.md +7 -0
  1761. package/repos/effect/packages/sql/libsql/docgen.json +24 -0
  1762. package/repos/effect/packages/sql/libsql/package.json +73 -0
  1763. package/repos/effect/packages/sql/libsql/src/LibsqlClient.ts +381 -0
  1764. package/repos/effect/packages/sql/libsql/src/LibsqlMigrator.ts +46 -0
  1765. package/repos/effect/packages/sql/libsql/src/index.ts +15 -0
  1766. package/repos/effect/packages/sql/libsql/test/Client.test.ts +106 -0
  1767. package/repos/effect/packages/sql/libsql/test/Resolver.test.ts +177 -0
  1768. package/repos/effect/packages/sql/libsql/test/util.ts +54 -0
  1769. package/repos/effect/packages/sql/libsql/tsconfig.json +9 -0
  1770. package/repos/effect/packages/sql/libsql/vitest.config.ts +6 -0
  1771. package/repos/effect/packages/sql/mssql/CHANGELOG.md +601 -0
  1772. package/repos/effect/packages/sql/mssql/LICENSE +21 -0
  1773. package/repos/effect/packages/sql/mssql/README.md +7 -0
  1774. package/repos/effect/packages/sql/mssql/docgen.json +24 -0
  1775. package/repos/effect/packages/sql/mssql/package.json +70 -0
  1776. package/repos/effect/packages/sql/mssql/src/MssqlClient.ts +732 -0
  1777. package/repos/effect/packages/sql/mssql/src/MssqlMigrator.ts +45 -0
  1778. package/repos/effect/packages/sql/mssql/src/Parameter.ts +64 -0
  1779. package/repos/effect/packages/sql/mssql/src/Procedure.ts +213 -0
  1780. package/repos/effect/packages/sql/mssql/src/index.ts +32 -0
  1781. package/repos/effect/packages/sql/mssql/test/Client.test.ts +91 -0
  1782. package/repos/effect/packages/sql/mssql/test/SqlErrorClassification.test.ts +206 -0
  1783. package/repos/effect/packages/sql/mssql/tsconfig.json +8 -0
  1784. package/repos/effect/packages/sql/mssql/vitest.config.ts +6 -0
  1785. package/repos/effect/packages/sql/mysql2/CHANGELOG.md +603 -0
  1786. package/repos/effect/packages/sql/mysql2/LICENSE +21 -0
  1787. package/repos/effect/packages/sql/mysql2/README.md +7 -0
  1788. package/repos/effect/packages/sql/mysql2/docgen.json +24 -0
  1789. package/repos/effect/packages/sql/mysql2/package.json +71 -0
  1790. package/repos/effect/packages/sql/mysql2/src/MysqlClient.ts +517 -0
  1791. package/repos/effect/packages/sql/mysql2/src/MysqlMigrator.ts +102 -0
  1792. package/repos/effect/packages/sql/mysql2/src/index.ts +15 -0
  1793. package/repos/effect/packages/sql/mysql2/test/Client.test.ts +34 -0
  1794. package/repos/effect/packages/sql/mysql2/test/KeyValueStore.test.ts +16 -0
  1795. package/repos/effect/packages/sql/mysql2/test/Model.test.ts +227 -0
  1796. package/repos/effect/packages/sql/mysql2/test/MysqlClient.test.ts +35 -0
  1797. package/repos/effect/packages/sql/mysql2/test/Persistence.test.ts +22 -0
  1798. package/repos/effect/packages/sql/mysql2/test/SqlErrorClassification.test.ts +133 -0
  1799. package/repos/effect/packages/sql/mysql2/test/SqlEventLogServerUnencrypted.test.ts +7 -0
  1800. package/repos/effect/packages/sql/mysql2/test/utils.ts +64 -0
  1801. package/repos/effect/packages/sql/mysql2/tsconfig.json +9 -0
  1802. package/repos/effect/packages/sql/mysql2/vitest.config.ts +6 -0
  1803. package/repos/effect/packages/sql/pg/CHANGELOG.md +3432 -0
  1804. package/repos/effect/packages/sql/pg/LICENSE +21 -0
  1805. package/repos/effect/packages/sql/pg/README.md +7 -0
  1806. package/repos/effect/packages/sql/pg/docgen.json +24 -0
  1807. package/repos/effect/packages/sql/pg/package.json +77 -0
  1808. package/repos/effect/packages/sql/pg/src/PgClient.ts +947 -0
  1809. package/repos/effect/packages/sql/pg/src/PgMigrator.ts +120 -0
  1810. package/repos/effect/packages/sql/pg/src/index.ts +15 -0
  1811. package/repos/effect/packages/sql/pg/test/Client.test.ts +373 -0
  1812. package/repos/effect/packages/sql/pg/test/KeyValueStore.test.ts +16 -0
  1813. package/repos/effect/packages/sql/pg/test/Persistence.test.ts +20 -0
  1814. package/repos/effect/packages/sql/pg/test/SqlErrorClassification.test.ts +81 -0
  1815. package/repos/effect/packages/sql/pg/test/SqlEventLogServerUnencrypted.test.ts +7 -0
  1816. package/repos/effect/packages/sql/pg/test/TransactionAcquire.test.ts +52 -0
  1817. package/repos/effect/packages/sql/pg/test/utils.ts +49 -0
  1818. package/repos/effect/packages/sql/pg/tsconfig.json +9 -0
  1819. package/repos/effect/packages/sql/pg/vitest.config.ts +6 -0
  1820. package/repos/effect/packages/sql/pglite/CHANGELOG.md +198 -0
  1821. package/repos/effect/packages/sql/pglite/LICENSE +21 -0
  1822. package/repos/effect/packages/sql/pglite/README.md +7 -0
  1823. package/repos/effect/packages/sql/pglite/docgen.json +24 -0
  1824. package/repos/effect/packages/sql/pglite/package.json +74 -0
  1825. package/repos/effect/packages/sql/pglite/src/PgliteClient.ts +503 -0
  1826. package/repos/effect/packages/sql/pglite/src/PgliteMigrator.ts +44 -0
  1827. package/repos/effect/packages/sql/pglite/src/index.ts +15 -0
  1828. package/repos/effect/packages/sql/pglite/test/Client.test.ts +149 -0
  1829. package/repos/effect/packages/sql/pglite/test/Migrator.test.ts +45 -0
  1830. package/repos/effect/packages/sql/pglite/test/SqlErrorClassification.test.ts +56 -0
  1831. package/repos/effect/packages/sql/pglite/test/Transaction.test.ts +62 -0
  1832. package/repos/effect/packages/sql/pglite/tsconfig.json +8 -0
  1833. package/repos/effect/packages/sql/pglite/vitest.config.ts +6 -0
  1834. package/repos/effect/packages/sql/sqlite-bun/CHANGELOG.md +601 -0
  1835. package/repos/effect/packages/sql/sqlite-bun/LICENSE +21 -0
  1836. package/repos/effect/packages/sql/sqlite-bun/README.md +7 -0
  1837. package/repos/effect/packages/sql/sqlite-bun/docgen.json +24 -0
  1838. package/repos/effect/packages/sql/sqlite-bun/package.json +69 -0
  1839. package/repos/effect/packages/sql/sqlite-bun/src/SqliteClient.ts +262 -0
  1840. package/repos/effect/packages/sql/sqlite-bun/src/SqliteMigrator.ts +90 -0
  1841. package/repos/effect/packages/sql/sqlite-bun/src/index.ts +15 -0
  1842. package/repos/effect/packages/sql/sqlite-bun/test/Client.test.ts +6 -0
  1843. package/repos/effect/packages/sql/sqlite-bun/tsconfig.json +11 -0
  1844. package/repos/effect/packages/sql/sqlite-bun/vitest.config.ts +6 -0
  1845. package/repos/effect/packages/sql/sqlite-do/CHANGELOG.md +601 -0
  1846. package/repos/effect/packages/sql/sqlite-do/LICENSE +21 -0
  1847. package/repos/effect/packages/sql/sqlite-do/README.md +7 -0
  1848. package/repos/effect/packages/sql/sqlite-do/docgen.json +24 -0
  1849. package/repos/effect/packages/sql/sqlite-do/package.json +68 -0
  1850. package/repos/effect/packages/sql/sqlite-do/src/SqliteClient.ts +249 -0
  1851. package/repos/effect/packages/sql/sqlite-do/src/SqliteMigrator.ts +45 -0
  1852. package/repos/effect/packages/sql/sqlite-do/src/index.ts +15 -0
  1853. package/repos/effect/packages/sql/sqlite-do/test/Client.test.ts +24 -0
  1854. package/repos/effect/packages/sql/sqlite-do/tsconfig.json +8 -0
  1855. package/repos/effect/packages/sql/sqlite-do/vitest.config.ts +6 -0
  1856. package/repos/effect/packages/sql/sqlite-node/CHANGELOG.md +3415 -0
  1857. package/repos/effect/packages/sql/sqlite-node/LICENSE +21 -0
  1858. package/repos/effect/packages/sql/sqlite-node/README.md +7 -0
  1859. package/repos/effect/packages/sql/sqlite-node/docgen.json +24 -0
  1860. package/repos/effect/packages/sql/sqlite-node/package.json +72 -0
  1861. package/repos/effect/packages/sql/sqlite-node/src/SqliteClient.ts +312 -0
  1862. package/repos/effect/packages/sql/sqlite-node/src/SqliteMigrator.ts +90 -0
  1863. package/repos/effect/packages/sql/sqlite-node/src/index.ts +15 -0
  1864. package/repos/effect/packages/sql/sqlite-node/test/Client.test.ts +75 -0
  1865. package/repos/effect/packages/sql/sqlite-node/test/KeyValueStore.test.ts +29 -0
  1866. package/repos/effect/packages/sql/sqlite-node/test/Persistence.test.ts +109 -0
  1867. package/repos/effect/packages/sql/sqlite-node/test/Resolver.test.ts +183 -0
  1868. package/repos/effect/packages/sql/sqlite-node/test/SqlEventJournal.test.ts +84 -0
  1869. package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerEncrypted.test.ts +249 -0
  1870. package/repos/effect/packages/sql/sqlite-node/test/SqlEventLogServerUnencrypted.test.ts +110 -0
  1871. package/repos/effect/packages/sql/sqlite-node/test/SqliteMigrator.test.ts +48 -0
  1872. package/repos/effect/packages/sql/sqlite-node/tsconfig.json +8 -0
  1873. package/repos/effect/packages/sql/sqlite-node/vitest.config.ts +6 -0
  1874. package/repos/effect/packages/sql/sqlite-react-native/CHANGELOG.md +601 -0
  1875. package/repos/effect/packages/sql/sqlite-react-native/LICENSE +21 -0
  1876. package/repos/effect/packages/sql/sqlite-react-native/README.md +7 -0
  1877. package/repos/effect/packages/sql/sqlite-react-native/docgen.json +24 -0
  1878. package/repos/effect/packages/sql/sqlite-react-native/package.json +69 -0
  1879. package/repos/effect/packages/sql/sqlite-react-native/src/SqliteClient.ts +354 -0
  1880. package/repos/effect/packages/sql/sqlite-react-native/src/SqliteMigrator.ts +55 -0
  1881. package/repos/effect/packages/sql/sqlite-react-native/src/index.ts +15 -0
  1882. package/repos/effect/packages/sql/sqlite-react-native/test/Client.test.ts +6 -0
  1883. package/repos/effect/packages/sql/sqlite-react-native/tsconfig.json +8 -0
  1884. package/repos/effect/packages/sql/sqlite-react-native/vitest.config.ts +6 -0
  1885. package/repos/effect/packages/sql/sqlite-wasm/CHANGELOG.md +601 -0
  1886. package/repos/effect/packages/sql/sqlite-wasm/LICENSE +21 -0
  1887. package/repos/effect/packages/sql/sqlite-wasm/README.md +7 -0
  1888. package/repos/effect/packages/sql/sqlite-wasm/docgen.json +24 -0
  1889. package/repos/effect/packages/sql/sqlite-wasm/package.json +69 -0
  1890. package/repos/effect/packages/sql/sqlite-wasm/src/OpfsWorker.ts +118 -0
  1891. package/repos/effect/packages/sql/sqlite-wasm/src/SqliteClient.ts +551 -0
  1892. package/repos/effect/packages/sql/sqlite-wasm/src/SqliteMigrator.ts +55 -0
  1893. package/repos/effect/packages/sql/sqlite-wasm/src/index.ts +14 -0
  1894. package/repos/effect/packages/sql/sqlite-wasm/src/internal/opfsWorker.ts +7 -0
  1895. package/repos/effect/packages/sql/sqlite-wasm/src/sqlite-wasm.d.ts +47 -0
  1896. package/repos/effect/packages/sql/sqlite-wasm/test/Client.test.ts +6 -0
  1897. package/repos/effect/packages/sql/sqlite-wasm/tsconfig.json +8 -0
  1898. package/repos/effect/packages/sql/sqlite-wasm/vitest.config.ts +6 -0
  1899. package/repos/effect/packages/tools/ai-codegen/codegen.schema.json +92 -0
  1900. package/repos/effect/packages/tools/ai-codegen/docgen.json +4 -0
  1901. package/repos/effect/packages/tools/ai-codegen/package.json +61 -0
  1902. package/repos/effect/packages/tools/ai-codegen/src/Config.ts +292 -0
  1903. package/repos/effect/packages/tools/ai-codegen/src/Discovery.ts +197 -0
  1904. package/repos/effect/packages/tools/ai-codegen/src/Generator.ts +183 -0
  1905. package/repos/effect/packages/tools/ai-codegen/src/Glob.ts +56 -0
  1906. package/repos/effect/packages/tools/ai-codegen/src/PostProcess.ts +157 -0
  1907. package/repos/effect/packages/tools/ai-codegen/src/SpecFetcher.ts +154 -0
  1908. package/repos/effect/packages/tools/ai-codegen/src/bin.ts +10 -0
  1909. package/repos/effect/packages/tools/ai-codegen/src/main.ts +237 -0
  1910. package/repos/effect/packages/tools/ai-codegen/tsconfig.json +15 -0
  1911. package/repos/effect/packages/tools/ai-docgen/docgen.json +4 -0
  1912. package/repos/effect/packages/tools/ai-docgen/package.json +60 -0
  1913. package/repos/effect/packages/tools/ai-docgen/src/Glob.ts +48 -0
  1914. package/repos/effect/packages/tools/ai-docgen/src/main.ts +186 -0
  1915. package/repos/effect/packages/tools/ai-docgen/tsconfig.json +14 -0
  1916. package/repos/effect/packages/tools/bundle/docgen.json +4 -0
  1917. package/repos/effect/packages/tools/bundle/fixtures/basic.ts +3 -0
  1918. package/repos/effect/packages/tools/bundle/fixtures/batching.ts +25 -0
  1919. package/repos/effect/packages/tools/bundle/fixtures/brand.ts +5 -0
  1920. package/repos/effect/packages/tools/bundle/fixtures/cache.ts +10 -0
  1921. package/repos/effect/packages/tools/bundle/fixtures/config.ts +13 -0
  1922. package/repos/effect/packages/tools/bundle/fixtures/differ.ts +9 -0
  1923. package/repos/effect/packages/tools/bundle/fixtures/http-client.ts +12 -0
  1924. package/repos/effect/packages/tools/bundle/fixtures/logger.ts +5 -0
  1925. package/repos/effect/packages/tools/bundle/fixtures/metric.ts +13 -0
  1926. package/repos/effect/packages/tools/bundle/fixtures/optic.ts +6 -0
  1927. package/repos/effect/packages/tools/bundle/fixtures/pubsub.ts +22 -0
  1928. package/repos/effect/packages/tools/bundle/fixtures/queue.ts +18 -0
  1929. package/repos/effect/packages/tools/bundle/fixtures/schedule.ts +9 -0
  1930. package/repos/effect/packages/tools/bundle/fixtures/schema-fromJsonSchemaDocument.ts +16 -0
  1931. package/repos/effect/packages/tools/bundle/fixtures/schema-representation-roundtrip.ts +16 -0
  1932. package/repos/effect/packages/tools/bundle/fixtures/schema-string-transformation.ts +20 -0
  1933. package/repos/effect/packages/tools/bundle/fixtures/schema-string.ts +8 -0
  1934. package/repos/effect/packages/tools/bundle/fixtures/schema-template-literal.ts +8 -0
  1935. package/repos/effect/packages/tools/bundle/fixtures/schema-toArbitraryLazy.ts +9 -0
  1936. package/repos/effect/packages/tools/bundle/fixtures/schema-toCodeDocument.ts +12 -0
  1937. package/repos/effect/packages/tools/bundle/fixtures/schema-toCodecJson.ts +9 -0
  1938. package/repos/effect/packages/tools/bundle/fixtures/schema-toEquivalence.ts +9 -0
  1939. package/repos/effect/packages/tools/bundle/fixtures/schema-toFormatter.ts +9 -0
  1940. package/repos/effect/packages/tools/bundle/fixtures/schema-toJsonSchemaDocument.ts +9 -0
  1941. package/repos/effect/packages/tools/bundle/fixtures/schema-toRepresentation.ts +9 -0
  1942. package/repos/effect/packages/tools/bundle/fixtures/schema.ts +12 -0
  1943. package/repos/effect/packages/tools/bundle/fixtures/stm.ts +21 -0
  1944. package/repos/effect/packages/tools/bundle/fixtures/stream.ts +7 -0
  1945. package/repos/effect/packages/tools/bundle/package.json +52 -0
  1946. package/repos/effect/packages/tools/bundle/src/Cli.ts +104 -0
  1947. package/repos/effect/packages/tools/bundle/src/Fixtures.ts +51 -0
  1948. package/repos/effect/packages/tools/bundle/src/Plugins.ts +131 -0
  1949. package/repos/effect/packages/tools/bundle/src/Reporter.ts +200 -0
  1950. package/repos/effect/packages/tools/bundle/src/Rollup.ts +179 -0
  1951. package/repos/effect/packages/tools/bundle/src/bin.ts +23 -0
  1952. package/repos/effect/packages/tools/bundle/tsconfig.fixtures.json +13 -0
  1953. package/repos/effect/packages/tools/bundle/tsconfig.json +9 -0
  1954. package/repos/effect/packages/tools/bundle/tsconfig.src.json +13 -0
  1955. package/repos/effect/packages/tools/jsdocs/docgen.json +4 -0
  1956. package/repos/effect/packages/tools/jsdocs/package.json +64 -0
  1957. package/repos/effect/packages/tools/jsdocs/src/Jsdocs.ts +3303 -0
  1958. package/repos/effect/packages/tools/jsdocs/src/bin.ts +23 -0
  1959. package/repos/effect/packages/tools/jsdocs/test/jsdocs.test.ts +979 -0
  1960. package/repos/effect/packages/tools/jsdocs/tsconfig.json +8 -0
  1961. package/repos/effect/packages/tools/jsdocs/vitest.config.ts +6 -0
  1962. package/repos/effect/packages/tools/openapi-generator/CHANGELOG.md +691 -0
  1963. package/repos/effect/packages/tools/openapi-generator/LICENSE +21 -0
  1964. package/repos/effect/packages/tools/openapi-generator/docgen.json +4 -0
  1965. package/repos/effect/packages/tools/openapi-generator/package.json +78 -0
  1966. package/repos/effect/packages/tools/openapi-generator/src/HttpApiTransformer.ts +552 -0
  1967. package/repos/effect/packages/tools/openapi-generator/src/JsonSchemaGenerator.ts +319 -0
  1968. package/repos/effect/packages/tools/openapi-generator/src/OpenApiGenerator.ts +1201 -0
  1969. package/repos/effect/packages/tools/openapi-generator/src/OpenApiPatch.ts +539 -0
  1970. package/repos/effect/packages/tools/openapi-generator/src/OpenApiTransformer.ts +1019 -0
  1971. package/repos/effect/packages/tools/openapi-generator/src/ParsedOperation.ts +277 -0
  1972. package/repos/effect/packages/tools/openapi-generator/src/Utils.ts +111 -0
  1973. package/repos/effect/packages/tools/openapi-generator/src/bin.ts +10 -0
  1974. package/repos/effect/packages/tools/openapi-generator/src/main.ts +116 -0
  1975. package/repos/effect/packages/tools/openapi-generator/test/JsonSchemaGenerator.test.ts +173 -0
  1976. package/repos/effect/packages/tools/openapi-generator/test/OpenApiGenerator.test.ts +2130 -0
  1977. package/repos/effect/packages/tools/openapi-generator/test/OpenApiGeneratorCli.test.ts +147 -0
  1978. package/repos/effect/packages/tools/openapi-generator/test/OpenApiPatch.test.ts +380 -0
  1979. package/repos/effect/packages/tools/openapi-generator/test/Utils.test.ts +33 -0
  1980. package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-basic-spec.json +35 -0
  1981. package/repos/effect/packages/tools/openapi-generator/test/fixtures/cli-warning-spec.json +57 -0
  1982. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/invalid-op.json +7 -0
  1983. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-path.json +6 -0
  1984. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/missing-value.json +6 -0
  1985. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-add.json +8 -0
  1986. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-multiple.json +17 -0
  1987. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-patch.yaml +6 -0
  1988. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-remove.json +6 -0
  1989. package/repos/effect/packages/tools/openapi-generator/test/fixtures/patches/valid-replace.json +7 -0
  1990. package/repos/effect/packages/tools/openapi-generator/tsconfig.json +9 -0
  1991. package/repos/effect/packages/tools/openapi-generator/vitest.config.ts +6 -0
  1992. package/repos/effect/packages/tools/oxc/docgen.json +4 -0
  1993. package/repos/effect/packages/tools/oxc/oxlintrc.json +83 -0
  1994. package/repos/effect/packages/tools/oxc/package.json +72 -0
  1995. package/repos/effect/packages/tools/oxc/src/oxlint/index.ts +18 -0
  1996. package/repos/effect/packages/tools/oxc/src/oxlint/rules/jsdocs.ts +108 -0
  1997. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-bigint-literals.ts +25 -0
  1998. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-import-from-barrel-package.ts +144 -0
  1999. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-js-extension-imports.ts +73 -0
  2000. package/repos/effect/packages/tools/oxc/src/oxlint/rules/no-opaque-instance-fields.ts +92 -0
  2001. package/repos/effect/packages/tools/oxc/test/jsdocs.test.ts +75 -0
  2002. package/repos/effect/packages/tools/oxc/test/no-import-from-barrel-package.test.ts +182 -0
  2003. package/repos/effect/packages/tools/oxc/test/no-js-extension-imports.test.ts +120 -0
  2004. package/repos/effect/packages/tools/oxc/test/no-opaque-instance-fields.test.ts +276 -0
  2005. package/repos/effect/packages/tools/oxc/test/utils.ts +61 -0
  2006. package/repos/effect/packages/tools/oxc/tsconfig.json +8 -0
  2007. package/repos/effect/packages/tools/oxc/vitest.config.ts +6 -0
  2008. package/repos/effect/packages/tools/utils/docgen.json +4 -0
  2009. package/repos/effect/packages/tools/utils/package.json +59 -0
  2010. package/repos/effect/packages/tools/utils/src/Codegen.ts +214 -0
  2011. package/repos/effect/packages/tools/utils/src/Glob.ts +61 -0
  2012. package/repos/effect/packages/tools/utils/src/bin.ts +16 -0
  2013. package/repos/effect/packages/tools/utils/src/commands/codegen.ts +44 -0
  2014. package/repos/effect/packages/tools/utils/tsconfig.json +9 -0
  2015. package/repos/effect/packages/vitest/CHANGELOG.md +601 -0
  2016. package/repos/effect/packages/vitest/LICENSE +21 -0
  2017. package/repos/effect/packages/vitest/README.md +320 -0
  2018. package/repos/effect/packages/vitest/docgen.json +24 -0
  2019. package/repos/effect/packages/vitest/package.json +60 -0
  2020. package/repos/effect/packages/vitest/src/index.ts +259 -0
  2021. package/repos/effect/packages/vitest/src/internal/internal.ts +374 -0
  2022. package/repos/effect/packages/vitest/src/utils.ts +321 -0
  2023. package/repos/effect/packages/vitest/test/index.test.ts +222 -0
  2024. package/repos/effect/packages/vitest/test/isolation.test.ts +105 -0
  2025. package/repos/effect/packages/vitest/test/nested-isolation.test.ts +212 -0
  2026. package/repos/effect/packages/vitest/tsconfig.json +11 -0
  2027. package/repos/effect/packages/vitest/typetest/index.tst.ts +56 -0
  2028. package/repos/effect/packages/vitest/vitest.config.ts +6 -0
  2029. package/repos/effect/patches/@changesets__assemble-release-plan.patch +26 -0
  2030. package/repos/effect/patches/@changesets__get-github-info.patch +44 -0
  2031. package/repos/effect/pnpm-lock.yaml +13483 -0
  2032. package/repos/effect/pnpm-workspace.yaml +10 -0
  2033. package/repos/effect/scripts/bundle-compare.sh +42 -0
  2034. package/repos/effect/scripts/check-cookbook-schedule.ts +390 -0
  2035. package/repos/effect/scripts/circular.mjs +26 -0
  2036. package/repos/effect/scripts/clean.mjs +19 -0
  2037. package/repos/effect/scripts/codemod.mjs +22 -0
  2038. package/repos/effect/scripts/codemods/jsdoc.ts +79 -0
  2039. package/repos/effect/scripts/docs.mjs +64 -0
  2040. package/repos/effect/scripts/package-scalar.mjs +14 -0
  2041. package/repos/effect/scripts/package-swagger.mjs +23 -0
  2042. package/repos/effect/scripts/package.json +22 -0
  2043. package/repos/effect/scripts/tsconfig.json +18 -0
  2044. package/repos/effect/scripts/version.mjs +9 -0
  2045. package/repos/effect/scripts/version.template.txt +2 -0
  2046. package/repos/effect/scripts/worktree-setup.sh +27 -0
  2047. package/repos/effect/stats.txt +30 -0
  2048. package/repos/effect/tsconfig.base.json +46 -0
  2049. package/repos/effect/tsconfig.json +128 -0
  2050. package/repos/effect/tsconfig.packages.json +39 -0
  2051. package/repos/effect/tstyche.json +7 -0
  2052. package/repos/effect/vitest.config.ts +31 -0
  2053. package/repos/effect/vitest.setup.ts +4 -0
  2054. package/repos/effect/vitest.shared.ts +61 -0
  2055. package/repos/effect.subtree.json +16 -0
@@ -0,0 +1,4712 @@
1
+ /* oxlint-disable no-restricted-syntax */
2
+ import { assert, describe, it } from "@effect/vitest"
3
+ import { assertExitFailure, assertSuccess, assertTrue, deepStrictEqual, strictEqual } from "@effect/vitest/utils"
4
+ import {
5
+ Array,
6
+ Cause,
7
+ Clock,
8
+ Context,
9
+ Data,
10
+ Deferred,
11
+ Duration,
12
+ Effect,
13
+ Exit,
14
+ Fiber,
15
+ Latch,
16
+ Logger,
17
+ type LogLevel,
18
+ Option,
19
+ type Pull,
20
+ Queue,
21
+ Ref,
22
+ References,
23
+ Result,
24
+ Schedule,
25
+ Sink,
26
+ Stream,
27
+ String as Str
28
+ } from "effect"
29
+ import { isReadonlyArrayNonEmpty, type NonEmptyArray } from "effect/Array"
30
+ import { constTrue, constVoid, pipe } from "effect/Function"
31
+ import { TestClock } from "effect/testing"
32
+ import * as fc from "effect/testing/FastCheck"
33
+ import { assertCauseFail, assertFailure } from "./utils/assert.ts"
34
+ import { chunkCoordination } from "./utils/chunkCoordination.ts"
35
+
36
+ describe("Stream", () => {
37
+ describe("callback", () => {
38
+ it.effect("with take", () =>
39
+ Effect.gen(function*() {
40
+ const array = [1, 2, 3, 4, 5]
41
+ const result = yield* Stream.callback<number>((mb) =>
42
+ Effect.sync(() => {
43
+ array.forEach((n) => {
44
+ Queue.offerUnsafe(mb, n)
45
+ })
46
+ })
47
+ ).pipe(
48
+ Stream.take(array.length),
49
+ Stream.runCollect
50
+ )
51
+ assert.deepStrictEqual(result, array)
52
+ }))
53
+
54
+ it.effect("with cleanup", () =>
55
+ Effect.gen(function*() {
56
+ let cleanup = false
57
+ const latch = yield* Latch.make()
58
+ const fiber = yield* Stream.callback<void>(Effect.fnUntraced(function*(mb) {
59
+ yield* Effect.addFinalizer(() =>
60
+ Effect.sync(() => {
61
+ cleanup = true
62
+ })
63
+ )
64
+ yield* Queue.offer(mb, void 0)
65
+ })).pipe(
66
+ Stream.tap(() => latch.open),
67
+ Stream.runDrain,
68
+ Effect.forkChild
69
+ )
70
+ yield* latch.await
71
+ yield* Fiber.interrupt(fiber)
72
+ assert.isTrue(cleanup)
73
+ }))
74
+
75
+ it.effect("signals the end of the stream", () =>
76
+ Effect.gen(function*() {
77
+ const result = yield* Stream.callback<number>((mb) => {
78
+ Queue.endUnsafe(mb)
79
+ return Effect.void
80
+ }).pipe(Stream.runCollect)
81
+ assert.isTrue(result.length === 0)
82
+ }))
83
+
84
+ it.effect("handles errors", () =>
85
+ Effect.gen(function*() {
86
+ const error = new Error("boom")
87
+ const result = yield* Stream.callback<number, Error>((mb) => {
88
+ Queue.failCauseUnsafe(mb, Cause.fail(error))
89
+ return Effect.void
90
+ }).pipe(
91
+ Stream.runCollect,
92
+ Effect.exit
93
+ )
94
+ assert.deepStrictEqual(result, Exit.fail(error))
95
+ }))
96
+
97
+ it.effect("handles defects", () =>
98
+ Effect.gen(function*() {
99
+ const error = new Error("boom")
100
+ const result = yield* Stream.callback<number, Error>(() => {
101
+ throw error
102
+ }).pipe(
103
+ Stream.runCollect,
104
+ Effect.exit
105
+ )
106
+ assert.deepStrictEqual(result, Exit.die(error))
107
+ }))
108
+
109
+ it.effect("backpressure", () =>
110
+ Effect.gen(function*() {
111
+ let count = 0
112
+ let offered = 0
113
+ let done = false
114
+ const pull = yield* Stream.callback<number>((mb) =>
115
+ Effect.forEach(
116
+ [1, 2, 3, 4, 5, 6, 7],
117
+ Effect.fnUntraced(function*(n) {
118
+ count++
119
+ yield* Queue.offer(mb, n)
120
+ offered++
121
+ }),
122
+ { concurrency: "unbounded" }
123
+ ).pipe(
124
+ Effect.tap(() => Effect.sync(() => done = true))
125
+ ), { bufferSize: 2 }).pipe(Stream.toPull)
126
+ yield* Effect.yieldNow
127
+ assert.strictEqual(count, 7)
128
+ assert.strictEqual(offered, 2)
129
+ assert.isFalse(done)
130
+ yield* pull
131
+ assert.strictEqual(offered, 4)
132
+ assert.isFalse(done)
133
+ }))
134
+ })
135
+
136
+ describe("destructors", () => {
137
+ it.effect("runForEachWhile continues across chunk boundaries", () =>
138
+ Effect.gen(function*() {
139
+ const seen: Array<number> = []
140
+ yield* Stream.fromArrays([1, 2], [3, 4]).pipe(
141
+ Stream.runForEachWhile((n) =>
142
+ Effect.sync(() => {
143
+ seen.push(n)
144
+ return true
145
+ })
146
+ )
147
+ )
148
+ assert.deepStrictEqual(seen, [1, 2, 3, 4])
149
+ }))
150
+
151
+ it.effect("runForEachWhile stops when predicate returns false", () =>
152
+ Effect.gen(function*() {
153
+ const seen: Array<number> = []
154
+ yield* Stream.fromArrays([1, 2, 3], [4, 5]).pipe(
155
+ Stream.runForEachWhile((n) =>
156
+ Effect.sync(() => {
157
+ seen.push(n)
158
+ return n < 3
159
+ })
160
+ )
161
+ )
162
+ assert.deepStrictEqual(seen, [1, 2, 3])
163
+ }))
164
+ })
165
+
166
+ describe("constructors", () => {
167
+ class Greeter extends Context.Service<Greeter, {
168
+ readonly greet: (name: string) => string
169
+ }>()("Greeter") {}
170
+
171
+ it.effect("range - min less than max", () =>
172
+ Effect.gen(function*() {
173
+ const result = yield* Stream.range(1, 3).pipe(Stream.runCollect)
174
+ assert.deepStrictEqual(result, [1, 2, 3])
175
+ }))
176
+
177
+ it.effect("service", () =>
178
+ Effect.gen(function*() {
179
+ const result = yield* Stream.service(Greeter).pipe(
180
+ Stream.map((greeter) => greeter.greet("World")),
181
+ Stream.provideService(Greeter, {
182
+ greet: (name) => `Hello, ${name}!`
183
+ }),
184
+ Stream.runCollect
185
+ )
186
+ assert.deepStrictEqual(result, ["Hello, World!"])
187
+ }))
188
+
189
+ it.effect("serviceOption - some", () =>
190
+ Effect.gen(function*() {
191
+ const result = yield* Stream.serviceOption(Greeter).pipe(
192
+ Stream.map((option) => Option.map(option, (greeter) => greeter.greet("World"))),
193
+ Stream.provideService(Greeter, {
194
+ greet: (name) => `Hello, ${name}!`
195
+ }),
196
+ Stream.runCollect
197
+ )
198
+ assert.deepStrictEqual(result, [Option.some("Hello, World!")])
199
+ }))
200
+
201
+ it.effect("serviceOption - none", () =>
202
+ Effect.gen(function*() {
203
+ const result = yield* Stream.serviceOption(Greeter).pipe(Stream.runCollect)
204
+ assert.deepStrictEqual(result, [Option.none()])
205
+ }))
206
+
207
+ it.effect("range - min greater than max", () =>
208
+ Effect.gen(function*() {
209
+ const result = yield* Stream.range(4, 3).pipe(Stream.runCollect)
210
+ assert.deepStrictEqual(result, [])
211
+ }))
212
+
213
+ it.effect("range - min equal to max", () =>
214
+ Effect.gen(function*() {
215
+ const result = yield* Stream.range(3, 3).pipe(Stream.runCollect)
216
+ assert.deepStrictEqual(result, [3])
217
+ }))
218
+
219
+ it.effect("fromIterable - emits array as one chunk by default", () =>
220
+ Effect.gen(function*() {
221
+ const result = yield* Stream.fromIterable([1, 2, 3, 4]).pipe(
222
+ Stream.chunks,
223
+ Stream.runCollect
224
+ )
225
+ assert.deepStrictEqual(result, [[1, 2, 3, 4]])
226
+ }))
227
+
228
+ it.effect("fromIterable - supports chunkSize option", () =>
229
+ Effect.gen(function*() {
230
+ const result = yield* Stream.fromIterable([1, 2, 3, 4, 5], { chunkSize: 2 }).pipe(
231
+ Stream.chunks,
232
+ Stream.runCollect
233
+ )
234
+ assert.deepStrictEqual(result, [[1, 2], [3, 4], [5]])
235
+ }))
236
+
237
+ it.effect("scoped - provides scope to fromEffect pull effects", () =>
238
+ Effect.gen(function*() {
239
+ const releases = yield* Ref.make(0)
240
+ const result = yield* Stream.fromEffect(
241
+ Effect.acquireRelease(
242
+ Effect.succeed("resource"),
243
+ () => Ref.update(releases, (n) => n + 1)
244
+ )
245
+ ).pipe(
246
+ Stream.scoped,
247
+ Stream.runCollect
248
+ )
249
+
250
+ assert.deepStrictEqual(result, ["resource"])
251
+ assert.strictEqual(yield* Ref.get(releases), 1)
252
+ }))
253
+
254
+ it.effect("scoped - provides scope to sequential mapEffect pull effects", () =>
255
+ Effect.gen(function*() {
256
+ const releases = yield* Ref.make(0)
257
+ const result = yield* Stream.fromIterable([1, 2]).pipe(
258
+ Stream.mapEffect((n) =>
259
+ Effect.acquireRelease(
260
+ Effect.succeed(n * 2),
261
+ () => Ref.update(releases, (count) => count + 1)
262
+ )
263
+ ),
264
+ Stream.scoped,
265
+ Stream.runCollect
266
+ )
267
+
268
+ assert.deepStrictEqual(result, [2, 4])
269
+ assert.strictEqual(yield* Ref.get(releases), 2)
270
+ }))
271
+
272
+ it.effect("fromReadableStream - errored streams fail with the mapped error, not a finalizer defect", () =>
273
+ Effect.gen(function*() {
274
+ const exit = yield* Stream.fromReadableStream({
275
+ evaluate: () =>
276
+ new ReadableStream<number>({
277
+ start(controller) {
278
+ controller.error(new Error("boom"))
279
+ }
280
+ }),
281
+ onError: (error) => new Error(`mapped: ${(error as Error).message}`)
282
+ }).pipe(Stream.runDrain, Effect.exit)
283
+
284
+ assertTrue(Exit.isFailure(exit))
285
+ if (Exit.isFailure(exit)) {
286
+ assertTrue(exit.cause.reasons.every(Cause.isFailReason))
287
+ deepStrictEqual(Cause.squash(exit.cause), new Error("mapped: boom"))
288
+ }
289
+ }))
290
+ })
291
+
292
+ describe("encoding", () => {
293
+ it.effect("decodeText handles multi-byte characters split across chunks", () =>
294
+ Effect.gen(function*() {
295
+ const bytes = new TextEncoder().encode("🌍")
296
+ const result = yield* Stream.make(bytes.slice(0, 2), bytes.slice(2)).pipe(
297
+ Stream.decodeText(),
298
+ Stream.mkString
299
+ )
300
+ assert.strictEqual(result, "🌍")
301
+ }))
302
+
303
+ it.effect("decodeText handles mixed ASCII and multi-byte characters across chunks", () =>
304
+ Effect.gen(function*() {
305
+ const bytes = new TextEncoder().encode("Hello 🌍!")
306
+ const split = 8
307
+ const result = yield* Stream.make(bytes.slice(0, split), bytes.slice(split)).pipe(
308
+ Stream.decodeText(),
309
+ Stream.mkString
310
+ )
311
+ assert.strictEqual(result, "Hello 🌍!")
312
+ }))
313
+
314
+ describe("splitLines", () => {
315
+ const splitLines = (chunks: ReadonlyArray<string>) =>
316
+ Stream.fromIterable(chunks).pipe(
317
+ Stream.splitLines,
318
+ Stream.runCollect
319
+ )
320
+
321
+ it.effect("handles an empty stream", () =>
322
+ Effect.gen(function*() {
323
+ const result = yield* splitLines([])
324
+ assert.deepStrictEqual(result, [])
325
+ }))
326
+
327
+ it.effect("handles empty chunks and repeated line feeds", () =>
328
+ Effect.gen(function*() {
329
+ const result = yield* splitLines(["", "a\n\n", "", "b\n", ""])
330
+ assert.deepStrictEqual(result, ["a", "", "b"])
331
+ }))
332
+
333
+ it.effect("handles line feeds across chunks", () =>
334
+ Effect.gen(function*() {
335
+ const result = yield* splitLines(["a\nb", "\nc\n", "d"])
336
+ assert.deepStrictEqual(result, ["a", "b", "c", "d"])
337
+ }))
338
+
339
+ it.effect("handles carriage return / line feed pairs across chunks", () =>
340
+ Effect.gen(function*() {
341
+ const result = yield* splitLines(["a\r", "\nb\r", "\nc"])
342
+ assert.deepStrictEqual(result, ["a", "b", "c"])
343
+ }))
344
+
345
+ it.effect("emits the final line when the stream does not end with a newline", () =>
346
+ Effect.gen(function*() {
347
+ const result = yield* splitLines(["a\nb\nc\n", "d\ne"])
348
+ assert.deepStrictEqual(result, ["a", "b", "c", "d", "e"])
349
+ }))
350
+
351
+ it.effect("does not pull upstream again after flushing the final line", () =>
352
+ Effect.gen(function*() {
353
+ let pulls = 0
354
+ const stream = Stream.fromPull(Effect.sync(() => {
355
+ const pull = Effect.suspend(
356
+ (): Pull.Pull<Array.NonEmptyReadonlyArray<string>, string> => {
357
+ pulls++
358
+ switch (pulls) {
359
+ case 1:
360
+ return Effect.succeed(Array.of("a"))
361
+ case 2:
362
+ return Cause.done()
363
+ default:
364
+ return Effect.fail("pulled after done")
365
+ }
366
+ }
367
+ )
368
+ return pull
369
+ }))
370
+
371
+ const result = yield* stream.pipe(
372
+ Stream.splitLines,
373
+ Stream.runCollect
374
+ )
375
+
376
+ assert.deepStrictEqual(result, ["a"])
377
+ assert.strictEqual(pulls, 2)
378
+ }))
379
+
380
+ it.effect("handles standalone carriage returns within a chunk", () =>
381
+ Effect.gen(function*() {
382
+ const result = yield* splitLines(["a\rb\rc"])
383
+ assert.deepStrictEqual(result, ["a", "b", "c"])
384
+ }))
385
+
386
+ it.effect("handles standalone carriage returns across chunk boundaries", () =>
387
+ Effect.gen(function*() {
388
+ const result = yield* splitLines(["a\r", "b\r", "c"])
389
+ assert.deepStrictEqual(result, ["a", "b", "c"])
390
+ }))
391
+
392
+ it.effect.prop(
393
+ "matches String.linesIterator regardless of chunk boundaries",
394
+ {
395
+ chunks: fc.array(
396
+ fc.array(fc.constantFrom("a", "b", "\n", "\r"), { maxLength: 8 }).map((chars) => chars.join("")),
397
+ { maxLength: 8 }
398
+ )
399
+ },
400
+ Effect.fnUntraced(function*({ chunks }) {
401
+ const result = yield* splitLines(chunks)
402
+ const expected = globalThis.Array.from(Str.linesIterator(chunks.join("")))
403
+ assert.deepStrictEqual(result, expected)
404
+ })
405
+ )
406
+ })
407
+ })
408
+
409
+ describe("filtering", () => {
410
+ it.effect("filterMap", () =>
411
+ Effect.gen(function*() {
412
+ const result = yield* Stream.make(1, 2, 3, 4).pipe(
413
+ Stream.filterMap((n) => n % 2 === 0 ? Result.succeed(n + 10) : Result.failVoid),
414
+ Stream.runCollect
415
+ )
416
+ assert.deepStrictEqual(result, [12, 14])
417
+ }))
418
+
419
+ it.effect("filterMapEffect", () =>
420
+ Effect.gen(function*() {
421
+ const result = yield* Stream.make(1, 2, 3, 4).pipe(
422
+ Stream.filterMapEffect((n) => Effect.succeed(n % 2 === 0 ? Result.succeed(n + 1) : Result.failVoid)),
423
+ Stream.runCollect
424
+ )
425
+ assert.deepStrictEqual(result, [3, 5])
426
+ }))
427
+ })
428
+
429
+ describe("taking", () => {
430
+ it.effect("take - pulls the first `n` values from a stream", () =>
431
+ Effect.gen(function*() {
432
+ const result = yield* Stream.range(1, 5).pipe(
433
+ Stream.take(3),
434
+ Stream.runCollect
435
+ )
436
+ assert.deepStrictEqual(result, [1, 2, 3])
437
+ }))
438
+
439
+ it.effect("take - short-circuits stream evaluation", () =>
440
+ Effect.gen(function*() {
441
+ const result = yield* Stream.succeed(1).pipe(
442
+ Stream.concat(Stream.never),
443
+ Stream.take(1),
444
+ Stream.runCollect
445
+ )
446
+ assert.deepStrictEqual(result, [1])
447
+ }))
448
+
449
+ it.effect("take - taking 0 short-circuits stream evaluation", () =>
450
+ Effect.gen(function*() {
451
+ const result = yield* Stream.never.pipe(
452
+ Stream.take(0),
453
+ Stream.runCollect
454
+ )
455
+ assert.deepStrictEqual(result, [])
456
+ }))
457
+
458
+ it.effect("takeUntil - takes elements until a predicate is satisfied", () =>
459
+ Effect.gen(function*() {
460
+ const result = yield* Stream.range(1, 5).pipe(
461
+ Stream.takeUntil((n) => n % 3 === 0),
462
+ Stream.runCollect
463
+ )
464
+ assert.deepStrictEqual(result, [1, 2, 3])
465
+ }))
466
+
467
+ it.effect("takeWhile - takes elements while a predicate is satisfied", () =>
468
+ Effect.gen(function*() {
469
+ const result = yield* Stream.range(1, 5).pipe(
470
+ Stream.takeWhile((n) => n % 3 !== 0),
471
+ Stream.runCollect
472
+ )
473
+ assert.deepStrictEqual(result, [1, 2])
474
+ }))
475
+
476
+ it.effect("takeWhileFilter - takes elements while a filter succeeds", () =>
477
+ Effect.gen(function*() {
478
+ const result = yield* Stream.range(1, 5).pipe(
479
+ Stream.takeWhileFilter((n) => n < 3 ? Result.succeed(n + 10) : Result.failVoid),
480
+ Stream.runCollect
481
+ )
482
+ assert.deepStrictEqual(result, [11, 12])
483
+ }))
484
+
485
+ it.effect("takeUntilEffect - takes elements until an effectful predicate is satisfied", () =>
486
+ Effect.gen(function*() {
487
+ const result = yield* Stream.range(1, 5).pipe(
488
+ Stream.takeUntilEffect((n) => Effect.succeed(n % 3 === 0)),
489
+ Stream.runCollect
490
+ )
491
+ assert.deepStrictEqual(result, [1, 2, 3])
492
+ }))
493
+
494
+ it.effect("takeWhileEffect - takes elements while an effectful predicate is satisfied", () =>
495
+ Effect.gen(function*() {
496
+ const result = yield* Stream.range(1, 5).pipe(
497
+ Stream.takeWhileEffect((n) => Effect.succeed(n % 3 !== 0)),
498
+ Stream.runCollect
499
+ )
500
+ assert.deepStrictEqual(result, [1, 2])
501
+ }))
502
+
503
+ it.effect("takeRight", () =>
504
+ Effect.gen(function*() {
505
+ const take = 3
506
+ const stream = Stream.range(1, 5)
507
+ const { result1, result2 } = yield* (Effect.all({
508
+ result1: pipe(stream, Stream.takeRight(take), Stream.runCollect),
509
+ result2: pipe(Stream.runCollect(stream), Effect.map(Array.takeRight(take)))
510
+ }))
511
+ deepStrictEqual(result1, result2)
512
+ }))
513
+ })
514
+
515
+ describe("pagination", () => {
516
+ it.effect("paginate", () =>
517
+ Effect.gen(function*() {
518
+ const s: readonly [ReadonlyArray<number>, Array<number>] = [[0], [1, 2, 3, 4, 5]]
519
+ const pageSize = 2
520
+ const result = yield* Stream.paginate(s, ([chunk, nums]) =>
521
+ nums.length === 0 ?
522
+ Effect.succeed([chunk, Option.none<readonly [ReadonlyArray<number>, Array<number>]>()] as const) :
523
+ Effect.succeed(
524
+ [
525
+ chunk,
526
+ Option.some(
527
+ [
528
+ nums.slice(0, pageSize),
529
+ nums.slice(pageSize)
530
+ ] as const
531
+ )
532
+ ] as const
533
+ )).pipe(Stream.runCollect)
534
+ assert.deepStrictEqual(result, [0, 1, 2, 3, 4, 5])
535
+ }))
536
+ })
537
+
538
+ describe("error handling", () => {
539
+ it.effect("catch", () =>
540
+ Effect.gen(function*() {
541
+ let error: string | undefined = undefined
542
+ const results = yield* Stream.make(1, 2, 3).pipe(
543
+ Stream.concat(Stream.fail("boom")),
544
+ Stream.catch((error_) => {
545
+ error = error_
546
+ return Stream.make(4, 5, 6)
547
+ }),
548
+ Stream.runCollect
549
+ )
550
+ assert.deepStrictEqual(results, [1, 2, 3, 4, 5, 6])
551
+ assert.strictEqual(error, "boom")
552
+ }))
553
+
554
+ it.effect("tapCause preserves failures", () =>
555
+ Effect.gen(function*() {
556
+ const exit = yield* Stream.fail("boom").pipe(
557
+ Stream.tapCause(() => Effect.void),
558
+ Stream.runCollect,
559
+ Effect.exit
560
+ )
561
+ assertExitFailure(exit, Cause.fail("boom"))
562
+ }))
563
+
564
+ it.effect("tapCause preserves defects", () =>
565
+ Effect.gen(function*() {
566
+ const defect = new Error("boom")
567
+ const exit = yield* Stream.die(defect).pipe(
568
+ Stream.tapCause(() => Effect.void),
569
+ Stream.runCollect,
570
+ Effect.exit
571
+ )
572
+ assertExitFailure(exit, Cause.die(defect))
573
+ }))
574
+
575
+ it.effect("catchIf with refinement", () =>
576
+ Effect.gen(function*() {
577
+ interface ErrorA {
578
+ readonly _tag: "ErrorA"
579
+ }
580
+ interface ErrorB {
581
+ readonly _tag: "ErrorB"
582
+ }
583
+ const stream: Stream.Stream<never, ErrorA | ErrorB> = Stream.fail({ _tag: "ErrorB" as const })
584
+ const result = yield* pipe(
585
+ stream,
586
+ Stream.catchIf((error): error is ErrorA => error._tag === "ErrorA", () => Stream.succeed("ok")),
587
+ Stream.runCollect,
588
+ Effect.exit
589
+ )
590
+ assert.deepStrictEqual(result, Exit.fail({ _tag: "ErrorB" as const }))
591
+ }))
592
+
593
+ it.effect("catchIf with refinement orElse", () =>
594
+ Effect.gen(function*() {
595
+ interface ErrorA {
596
+ readonly _tag: "ErrorA"
597
+ }
598
+ interface ErrorB {
599
+ readonly _tag: "ErrorB"
600
+ }
601
+ const result = yield* (Stream.fail({ _tag: "ErrorB" as const }) as Stream.Stream<never, ErrorA | ErrorB>).pipe(
602
+ Stream.catchIf(
603
+ (error): error is ErrorA => error._tag === "ErrorA",
604
+ () => Stream.succeed("caught"),
605
+ () => Stream.succeed("fallback")
606
+ ),
607
+ Stream.runCollect
608
+ )
609
+ assert.deepStrictEqual(result, ["fallback"])
610
+ }))
611
+
612
+ it.effect("catchIf with predicate", () =>
613
+ Effect.gen(function*() {
614
+ const result = yield* pipe(
615
+ Stream.fail("boom" as string | number),
616
+ Stream.catchIf(
617
+ (e) => typeof e === "string",
618
+ (e) => Stream.succeed(`caught: ${e}`)
619
+ ),
620
+ Stream.runCollect
621
+ )
622
+ assert.deepStrictEqual(result, ["caught: boom"])
623
+ }))
624
+
625
+ it.effect("catchIf predicate no match", () =>
626
+ Effect.gen(function*() {
627
+ const result = yield* pipe(
628
+ Stream.fail(42 as string | number),
629
+ Stream.catchIf(
630
+ (e) => typeof e === "string",
631
+ () => Stream.succeed("caught")
632
+ ),
633
+ Stream.runCollect,
634
+ Effect.exit
635
+ )
636
+ assert.deepStrictEqual(result, Exit.fail(42))
637
+ }))
638
+
639
+ it.effect("catchIf with filter input", () =>
640
+ Effect.gen(function*() {
641
+ const matched = yield* Stream.catchFilter(
642
+ Stream.fail("boom" as string | number),
643
+ (e: string | number) => typeof e === "string" ? Result.succeed(e.length) : Result.fail(`fallback: ${e}`),
644
+ (length) => Stream.succeed(`caught: ${length}`),
645
+ (failure) => Stream.succeed(failure)
646
+ ).pipe(Stream.runCollect)
647
+ const unmatched = yield* Stream.catchFilter(
648
+ Stream.fail(42 as string | number),
649
+ (e: string | number) => typeof e === "string" ? Result.succeed(e.length) : Result.fail(`fallback: ${e}`),
650
+ (length) => Stream.succeed(`caught: ${length}`),
651
+ (failure) => Stream.succeed(failure)
652
+ ).pipe(Stream.runCollect)
653
+ assert.deepStrictEqual(matched, ["caught: 4"])
654
+ assert.deepStrictEqual(unmatched, ["fallback: 42"])
655
+ }))
656
+
657
+ it.effect("catchCauseFilter", () =>
658
+ Effect.gen(function*() {
659
+ const recovered = yield* Stream.fail("boom").pipe(
660
+ Stream.catchCauseFilter(
661
+ (cause) => Cause.hasFails(cause) ? Result.succeed(Cause.squash(cause)) : Result.fail(cause),
662
+ (failure) => Stream.succeed(`recovered: ${failure}`)
663
+ ),
664
+ Stream.runCollect
665
+ )
666
+ assert.deepStrictEqual(recovered, ["recovered: boom"])
667
+ }))
668
+
669
+ it.effect("catchTag orElse", () =>
670
+ Effect.gen(function*() {
671
+ class HttpError extends Data.TaggedError("HttpError")<{
672
+ readonly message: string
673
+ }> {}
674
+ class ValidationError extends Data.TaggedError("ValidationError")<{
675
+ readonly field: string
676
+ }> {}
677
+ const result = yield* Stream.catchTag(
678
+ Stream.fail(new ValidationError({ field: "email" })) as Stream.Stream<never, HttpError | ValidationError>,
679
+ "HttpError",
680
+ () => Stream.succeed("http"),
681
+ () => Stream.succeed("fallback")
682
+ ).pipe(Stream.runCollect)
683
+ assert.deepStrictEqual(result, ["fallback"])
684
+ }))
685
+
686
+ describe("ignore", () => {
687
+ type IgnoreOptions = { readonly log?: boolean | LogLevel.Severity }
688
+
689
+ const makeTestLogger = () => {
690
+ const capturedLogs: Array<{
691
+ readonly logLevel: LogLevel.LogLevel
692
+ readonly cause: Cause.Cause<unknown>
693
+ }> = []
694
+ const testLogger = Logger.make<unknown, void>((options) => {
695
+ capturedLogs.push({ logLevel: options.logLevel, cause: options.cause })
696
+ })
697
+ return { capturedLogs, testLogger }
698
+ }
699
+
700
+ const runIgnore = (options?: IgnoreOptions, currentLogLevel: LogLevel.Severity = "Info") =>
701
+ Effect.gen(function*() {
702
+ const { capturedLogs, testLogger } = makeTestLogger()
703
+ const program = options === undefined
704
+ ? Stream.fail("boom").pipe(Stream.ignore, Stream.runDrain)
705
+ : Stream.fail("boom").pipe(Stream.ignore(options), Stream.runDrain)
706
+ yield* program.pipe(
707
+ Effect.provide(Logger.layer([testLogger])),
708
+ Effect.provideService(References.MinimumLogLevel, "Trace"),
709
+ Effect.provideService(References.CurrentLogLevel, currentLogLevel)
710
+ )
711
+ return capturedLogs
712
+ })
713
+
714
+ it.effect("does not log when log is omitted", () =>
715
+ Effect.gen(function*() {
716
+ const logs = yield* runIgnore()
717
+ assert.strictEqual(logs.length, 0)
718
+ }))
719
+
720
+ it.effect("does not log when log is false", () =>
721
+ Effect.gen(function*() {
722
+ const logs = yield* runIgnore({ log: false })
723
+ assert.strictEqual(logs.length, 0)
724
+ }))
725
+
726
+ it.effect("logs with the current level when log is true", () =>
727
+ Effect.gen(function*() {
728
+ const logs = yield* runIgnore({ log: true }, "Warn")
729
+ assert.strictEqual(logs.length, 1)
730
+ assert.strictEqual(logs[0].logLevel, "Warn")
731
+ assertCauseFail(logs[0].cause, "boom")
732
+ }))
733
+
734
+ it.effect("logs with the provided level when log is a LogLevel", () =>
735
+ Effect.gen(function*() {
736
+ const logs = yield* runIgnore({ log: "Error" }, "Warn")
737
+ assert.strictEqual(logs.length, 1)
738
+ assert.strictEqual(logs[0].logLevel, "Error")
739
+ assertCauseFail(logs[0].cause, "boom")
740
+ }))
741
+ })
742
+
743
+ describe("catchReason", () => {
744
+ class RateLimitError extends Data.TaggedError("RateLimitError")<{
745
+ readonly retryAfter: number
746
+ }> {}
747
+
748
+ class QuotaExceededError extends Data.TaggedError("QuotaExceededError")<{
749
+ readonly limit: number
750
+ }> {}
751
+
752
+ class AiError extends Data.TaggedError("AiError")<{
753
+ readonly reason: RateLimitError | QuotaExceededError
754
+ }> {}
755
+
756
+ class OtherError extends Data.TaggedError("OtherError")<{
757
+ readonly message: string
758
+ }> {}
759
+
760
+ it.effect("catches matching reason - handler succeeds", () =>
761
+ Effect.gen(function*() {
762
+ const result = yield* Stream.fail(
763
+ new AiError({ reason: new RateLimitError({ retryAfter: 60 }) })
764
+ ).pipe(
765
+ Stream.catchReason("AiError", "RateLimitError", (r) => Stream.succeed(`retry: ${r.retryAfter}`)),
766
+ Stream.runCollect
767
+ )
768
+ assert.deepStrictEqual(result, ["retry: 60"])
769
+ }))
770
+
771
+ it.effect("catches matching reason - handler fails", () =>
772
+ Effect.gen(function*() {
773
+ const reason = new RateLimitError({ retryAfter: 60 })
774
+ const error = new OtherError({ message: "handled" })
775
+ const exit = yield* Stream.fail(new AiError({ reason })).pipe(
776
+ Stream.catchReason("AiError", "RateLimitError", () => Stream.fail(error)),
777
+ Stream.runCollect,
778
+ Effect.exit
779
+ )
780
+ assertExitFailure(exit, Cause.fail(error))
781
+ }))
782
+
783
+ it.effect("ignores non-matching reason", () =>
784
+ Effect.gen(function*() {
785
+ const reason = new QuotaExceededError({ limit: 100 })
786
+ const error = new AiError({ reason })
787
+ const exit = yield* Stream.fail(error).pipe(
788
+ Stream.catchReason("AiError", "RateLimitError", () => Stream.succeed("no")),
789
+ Stream.runCollect,
790
+ Effect.exit
791
+ )
792
+ assertExitFailure(exit, Cause.fail(error))
793
+ }))
794
+
795
+ it.effect("handles non-matching reason with orElse", () =>
796
+ Effect.gen(function*() {
797
+ const result = yield* Stream.fail(
798
+ new AiError({ reason: new QuotaExceededError({ limit: 100 }) })
799
+ ).pipe(
800
+ Stream.catchReason(
801
+ "AiError",
802
+ "RateLimitError",
803
+ (reason) => Stream.succeed(`retry: ${reason.retryAfter}`),
804
+ (reason) => Stream.succeed(`quota: ${reason.limit}`)
805
+ ),
806
+ Stream.runCollect
807
+ )
808
+ assert.deepStrictEqual(result, ["quota: 100"])
809
+ }))
810
+
811
+ it.effect("ignores non-matching parent tag", () =>
812
+ Effect.gen(function*() {
813
+ const error = new OtherError({ message: "test" })
814
+ const exit = yield* (Stream.fail(error) as Stream.Stream<never, AiError | OtherError>).pipe(
815
+ Stream.catchReason("AiError", "RateLimitError", () => Stream.succeed("no")),
816
+ Stream.runCollect,
817
+ Effect.exit
818
+ )
819
+ assertExitFailure(exit, Cause.fail(error))
820
+ }))
821
+
822
+ it.effect("orElse ignores non-matching parent tag", () =>
823
+ Effect.gen(function*() {
824
+ const error = new OtherError({ message: "test" })
825
+ const exit = yield* (Stream.fail(error) as Stream.Stream<never, AiError | OtherError>).pipe(
826
+ Stream.catchReason(
827
+ "AiError",
828
+ "RateLimitError",
829
+ () => Stream.succeed("no"),
830
+ () => Stream.succeed("fallback")
831
+ ),
832
+ Stream.runCollect,
833
+ Effect.exit
834
+ )
835
+ assertExitFailure(exit, Cause.fail(error))
836
+ }))
837
+ })
838
+
839
+ describe("catchReasons", () => {
840
+ class RateLimitError extends Data.TaggedError("RateLimitError")<{
841
+ readonly retryAfter: number
842
+ }> {}
843
+
844
+ class QuotaExceededError extends Data.TaggedError("QuotaExceededError")<{
845
+ readonly limit: number
846
+ }> {}
847
+
848
+ class AiError extends Data.TaggedError("AiError")<{
849
+ readonly reason: RateLimitError | QuotaExceededError
850
+ }> {}
851
+
852
+ it.effect("catches matching reason", () =>
853
+ Effect.gen(function*() {
854
+ const result = yield* Stream.fail(
855
+ new AiError({ reason: new RateLimitError({ retryAfter: 60 }) })
856
+ ).pipe(
857
+ Stream.catchReasons("AiError", {
858
+ RateLimitError: (r) => Stream.succeed(`retry: ${r.retryAfter}`)
859
+ }),
860
+ Stream.runCollect
861
+ )
862
+ assert.deepStrictEqual(result, ["retry: 60"])
863
+ }))
864
+
865
+ it.effect("ignores non-matching reason", () =>
866
+ Effect.gen(function*() {
867
+ const reason = new QuotaExceededError({ limit: 100 })
868
+ const error = new AiError({ reason })
869
+ const exit = yield* Stream.fail(error).pipe(
870
+ Stream.catchReasons("AiError", {
871
+ RateLimitError: () => Stream.succeed("no")
872
+ }),
873
+ Stream.runCollect,
874
+ Effect.exit
875
+ )
876
+ assertExitFailure(exit, Cause.fail(error))
877
+ }))
878
+
879
+ it.effect("handles non-matching reason with orElse", () =>
880
+ Effect.gen(function*() {
881
+ const result = yield* Stream.fail(
882
+ new AiError({ reason: new RateLimitError({ retryAfter: 60 }) })
883
+ ).pipe(
884
+ Stream.catchReasons(
885
+ "AiError",
886
+ {
887
+ QuotaExceededError: (reason) => Stream.succeed(`quota: ${reason.limit}`)
888
+ },
889
+ (reason) => Stream.succeed(`fallback: ${reason._tag}`)
890
+ ),
891
+ Stream.runCollect
892
+ )
893
+ assert.deepStrictEqual(result, ["fallback: RateLimitError"])
894
+ }))
895
+ })
896
+
897
+ describe("ignoreCause", () => {
898
+ type IgnoreCauseOptions = { readonly log?: boolean | LogLevel.Severity }
899
+
900
+ const makeTestLogger = () => {
901
+ const capturedLogs: Array<{
902
+ readonly logLevel: LogLevel.LogLevel
903
+ readonly cause: Cause.Cause<unknown>
904
+ }> = []
905
+ const testLogger = Logger.make<unknown, void>((options) => {
906
+ capturedLogs.push({ logLevel: options.logLevel, cause: options.cause })
907
+ })
908
+ return { capturedLogs, testLogger }
909
+ }
910
+
911
+ const runIgnoreCause = (
912
+ options?: IgnoreCauseOptions,
913
+ currentLogLevel: LogLevel.Severity = "Info"
914
+ ) =>
915
+ Effect.gen(function*() {
916
+ const stream: Stream.Stream<never, string, never> = Stream.fail("boom")
917
+ const program: Effect.Effect<Array<never>, never, never> = options === undefined
918
+ ? stream.pipe(Stream.ignoreCause, Stream.runCollect)
919
+ : stream.pipe(Stream.ignoreCause(options), Stream.runCollect)
920
+ yield* Effect.scope
921
+ const { capturedLogs, testLogger } = makeTestLogger()
922
+ yield* program.pipe(
923
+ Effect.withLogger(testLogger),
924
+ Effect.provideService(References.MinimumLogLevel, "Trace"),
925
+ Effect.provideService(References.CurrentLogLevel, currentLogLevel)
926
+ )
927
+ return capturedLogs
928
+ })
929
+
930
+ it.effect("does not log when log is omitted", () =>
931
+ Effect.gen(function*() {
932
+ const logs = yield* runIgnoreCause()
933
+ assert.strictEqual(logs.length, 0)
934
+ }))
935
+
936
+ it.effect("does not log when log is false", () =>
937
+ Effect.gen(function*() {
938
+ const logs = yield* runIgnoreCause({ log: false })
939
+ assert.strictEqual(logs.length, 0)
940
+ }))
941
+
942
+ it.effect("logs with the current level when log is true", () =>
943
+ Effect.gen(function*() {
944
+ const logs = yield* runIgnoreCause({ log: true }, "Warn")
945
+ assert.strictEqual(logs.length, 1)
946
+ assert.strictEqual(logs[0].logLevel, "Warn")
947
+ assertCauseFail(logs[0].cause, "boom")
948
+ }))
949
+
950
+ it.effect("logs with the provided level when log is a LogLevel", () =>
951
+ Effect.gen(function*() {
952
+ const logs = yield* runIgnoreCause({ log: "Error" }, "Warn")
953
+ assert.strictEqual(logs.length, 1)
954
+ assert.strictEqual(logs[0].logLevel, "Error")
955
+ assertCauseFail(logs[0].cause, "boom")
956
+ }))
957
+ })
958
+ })
959
+
960
+ describe("scanning", () => {
961
+ it.effect("scan", () =>
962
+ Effect.gen(function*() {
963
+ const stream = Stream.make(1, 2, 3, 4, 5)
964
+ const { result1, result2 } = yield* Effect.all({
965
+ result1: stream.pipe(Stream.scan(0, (acc, curr) => acc + curr), Stream.runCollect),
966
+ result2: Stream.runCollect(stream).pipe(
967
+ Effect.map((chunk) => Array.scan(chunk, 0, (acc, curr) => acc + curr))
968
+ )
969
+ })
970
+ assert.deepStrictEqual(result1, result2)
971
+ }))
972
+
973
+ it.effect("scanEffect", () =>
974
+ Effect.gen(function*() {
975
+ const result = yield* Stream.make(1, 2, 3, 4, 5).pipe(
976
+ Stream.scanEffect(0, (acc, curr) => Effect.succeed(acc + curr)),
977
+ Stream.runCollect
978
+ )
979
+
980
+ assert.deepStrictEqual(result, Array.scan([1, 2, 3, 4, 5], 0, (acc, curr) => acc + curr))
981
+ }))
982
+ })
983
+
984
+ describe("grouping", () => {
985
+ it.effect("groupBy", () =>
986
+ Effect.gen(function*() {
987
+ const stream = Stream.make(1, 2, 3, 4, 5)
988
+ const grouped = yield* stream.pipe(
989
+ Stream.groupByKey((n) => n % 2 === 0 ? "even" : "odd"),
990
+ Stream.mapEffect(
991
+ Effect.fnUntraced(function*([key, stream]) {
992
+ return [key, yield* Stream.runCollect(stream)] as const
993
+ }),
994
+ { concurrency: "unbounded" }
995
+ ),
996
+ Stream.runCollect
997
+ )
998
+ assert.deepStrictEqual(grouped, [
999
+ ["odd", [1, 3, 5]],
1000
+ ["even", [2, 4]]
1001
+ ])
1002
+ }))
1003
+ })
1004
+
1005
+ describe("flattening", () => {
1006
+ it.effect("flatten supports dropping parens in pipe", () =>
1007
+ Effect.gen(function*() {
1008
+ const result = yield* pipe(
1009
+ Stream.make(
1010
+ Stream.make(1, 2),
1011
+ Stream.make(3, 4)
1012
+ ),
1013
+ Stream.flatten,
1014
+ Stream.runCollect
1015
+ )
1016
+ assert.deepStrictEqual(result, [1, 2, 3, 4])
1017
+ }))
1018
+
1019
+ it.effect("flattenEffect supports dropping parens in pipe", () =>
1020
+ Effect.gen(function*() {
1021
+ const result = yield* pipe(
1022
+ Stream.make(
1023
+ Effect.succeed(1),
1024
+ Effect.succeed(2),
1025
+ Effect.succeed(3)
1026
+ ),
1027
+ Stream.flattenEffect,
1028
+ Stream.runCollect
1029
+ )
1030
+ assert.deepStrictEqual(result, [1, 2, 3])
1031
+ }))
1032
+ })
1033
+
1034
+ it.effect.prop(
1035
+ "rechunk",
1036
+ {
1037
+ chunks: fc.array(fc.array(fc.integer()), { minLength: 1 }),
1038
+ size: fc.integer({ min: 1, max: 100 })
1039
+ },
1040
+ Effect.fnUntraced(function*({ chunks, size }) {
1041
+ const actual = yield* Stream.fromArray(chunks).pipe(
1042
+ Stream.filter((chunk): chunk is NonEmptyArray<number> => isReadonlyArrayNonEmpty(chunk)),
1043
+ Stream.flattenArray,
1044
+ Stream.rechunk(size),
1045
+ Stream.chunks,
1046
+ Stream.runCollect
1047
+ )
1048
+ const expected = chunks.flat()
1049
+ assert.deepStrictEqual(actual, grouped(expected, size))
1050
+ })
1051
+ )
1052
+
1053
+ describe("transduce", () => {
1054
+ it.effect("no remainder", () =>
1055
+ Effect.gen(function*() {
1056
+ const result = yield* Stream.make(1, 2, 3, 4).pipe(
1057
+ Stream.transduce(Sink.reduceWhile(() => 100, (n) => n % 2 === 0, (acc, n) => acc + n)),
1058
+ Stream.runCollect
1059
+ )
1060
+ assert.deepStrictEqual(result, [101, 105, 104])
1061
+ }))
1062
+
1063
+ it.effect("with a sink that always signals more", () =>
1064
+ Effect.gen(function*() {
1065
+ const result = yield* Stream.make(1, 2, 3).pipe(
1066
+ Stream.transduce(Sink.reduceWhile(() => 0, constTrue, (acc, n) => acc + n)),
1067
+ Stream.runCollect
1068
+ )
1069
+ assert.deepStrictEqual(result, [6])
1070
+ }))
1071
+
1072
+ it.effect("propagates scope error", () =>
1073
+ Effect.gen(function*() {
1074
+ const result = yield* Stream.make(1, 2, 3).pipe(
1075
+ Stream.transduce(Sink.fail("Woops")),
1076
+ Stream.runCollect,
1077
+ Effect.result
1078
+ )
1079
+ assertFailure(result, "Woops")
1080
+ }))
1081
+ })
1082
+
1083
+ describe("buffer", () => {
1084
+ it.effect("maintains elements and ordering", () =>
1085
+ Effect.gen(function*() {
1086
+ const chunks = Array.make(
1087
+ Array.range(0, 3),
1088
+ Array.range(2, 5),
1089
+ Array.range(3, 7)
1090
+ )
1091
+ const result = yield* Stream.fromArrays(...chunks).pipe(
1092
+ Stream.buffer({ capacity: 2 }),
1093
+ Stream.runCollect
1094
+ )
1095
+ assert.deepStrictEqual(result, chunks.flat())
1096
+ }))
1097
+
1098
+ it.effect("stream with a failure", () =>
1099
+ Effect.gen(function*() {
1100
+ const result = yield* Stream.range(0, 9).pipe(
1101
+ Stream.concat(Stream.fail("boom")),
1102
+ Stream.buffer({ capacity: 2 }),
1103
+ Stream.runCollect,
1104
+ Effect.exit
1105
+ )
1106
+ assertExitFailure(result, Cause.fail("boom"))
1107
+ }))
1108
+
1109
+ it.effect("fast producer progresses independently", () =>
1110
+ Effect.gen(function*() {
1111
+ const arr = Array.empty<number>()
1112
+ const latch = yield* Deferred.make<void>()
1113
+ const stream = Stream.range(1, 4).pipe(
1114
+ Stream.tap(Effect.fnUntraced(function*(n) {
1115
+ arr.push(n)
1116
+ if (n === 4) {
1117
+ yield* Deferred.succeed(latch, void 0)
1118
+ }
1119
+ })),
1120
+ Stream.buffer({ capacity: 2 })
1121
+ )
1122
+ const result1 = yield* stream.pipe(Stream.take(2), Stream.runCollect)
1123
+ yield* Deferred.await(latch)
1124
+ assert.deepStrictEqual(result1, [1, 2])
1125
+ assert.deepStrictEqual(arr, [1, 2, 3, 4])
1126
+ }))
1127
+ })
1128
+
1129
+ describe("bufferArray - suspend", () => {
1130
+ it.effect("maintains elements and ordering", () =>
1131
+ Effect.gen(function*() {
1132
+ const chunks = Array.make(
1133
+ Array.range(0, 3),
1134
+ Array.range(2, 5),
1135
+ Array.range(3, 7)
1136
+ )
1137
+ const result = yield* Stream.fromArrays(...chunks).pipe(
1138
+ Stream.bufferArray({ capacity: 2 }),
1139
+ Stream.runCollect
1140
+ )
1141
+ assert.deepStrictEqual(result, chunks.flat())
1142
+ }))
1143
+
1144
+ it.effect("stream with a failure", () =>
1145
+ Effect.gen(function*() {
1146
+ const error = "boom"
1147
+ const result = yield* Stream.range(0, 9).pipe(
1148
+ Stream.concat(Stream.fail(error)),
1149
+ Stream.bufferArray({ capacity: 2 }),
1150
+ Stream.runCollect,
1151
+ Effect.exit
1152
+ )
1153
+ assertExitFailure(result, Cause.fail(error))
1154
+ }))
1155
+
1156
+ it.effect("fast producer progresses independently", () =>
1157
+ Effect.gen(function*() {
1158
+ const arr = Array.empty<number>()
1159
+ const latch = yield* Deferred.make<void>()
1160
+ const stream = Stream.range(1, 4).pipe(
1161
+ Stream.tap(Effect.fnUntraced(function*(n) {
1162
+ arr.push(n)
1163
+ if (n === 4) {
1164
+ yield* Deferred.succeed(latch, void 0)
1165
+ }
1166
+ })),
1167
+ Stream.bufferArray({ capacity: 2 })
1168
+ )
1169
+ const result1 = yield* stream.pipe(Stream.take(2), Stream.runCollect)
1170
+ yield* Deferred.await(latch)
1171
+ assert.deepStrictEqual(result1, [1, 2])
1172
+ assert.deepStrictEqual(arr, [1, 2, 3, 4])
1173
+ }))
1174
+ })
1175
+
1176
+ describe("bufferArray - dropping", () => {
1177
+ it.effect("buffers a stream with a failure", () =>
1178
+ Effect.gen(function*() {
1179
+ const error = "boom"
1180
+ const result = yield* Stream.range(1, 1_000).pipe(
1181
+ Stream.concat(Stream.fail(error)),
1182
+ Stream.concat(Stream.range(1_001, 2_000)),
1183
+ Stream.bufferArray({ capacity: 2, strategy: "dropping" }),
1184
+ Stream.runCollect,
1185
+ Effect.exit
1186
+ )
1187
+ assert.deepStrictEqual(result, Exit.fail(error))
1188
+ }))
1189
+
1190
+ it.effect("fast producer progress independently", () =>
1191
+ Effect.gen(function*() {
1192
+ const arr = Array.empty<number>()
1193
+ const latch1 = yield* Deferred.make<void>()
1194
+ const latch2 = yield* Deferred.make<void>()
1195
+ const latch3 = yield* Deferred.make<void>()
1196
+ const latch4 = yield* Deferred.make<void>()
1197
+ const stream1 = Stream.make(0).pipe(
1198
+ Stream.concat(
1199
+ Stream.fromEffect(Deferred.await(latch1)).pipe(
1200
+ Stream.flatMap(() =>
1201
+ Stream.range(1, 16).pipe(
1202
+ Stream.rechunk(1),
1203
+ Stream.ensuring(Deferred.succeed(latch2, void 0))
1204
+ )
1205
+ )
1206
+ )
1207
+ )
1208
+ )
1209
+ const stream2 = Stream.fromEffect(Deferred.await(latch3)).pipe(
1210
+ Stream.flatMap(() =>
1211
+ Stream.range(17, 24).pipe(
1212
+ Stream.rechunk(1),
1213
+ Stream.ensuring(Deferred.succeed(latch4, void 0))
1214
+ )
1215
+ )
1216
+ )
1217
+ const stream3 = Stream.make(-1)
1218
+ const stream = stream1.pipe(
1219
+ Stream.concat(stream2),
1220
+ Stream.concat(stream3),
1221
+ Stream.bufferArray({ capacity: 8, strategy: "dropping" })
1222
+ )
1223
+ const { result1, result2, result3 } = yield* Stream.toPull(stream).pipe(
1224
+ Effect.flatMap((pull) =>
1225
+ Effect.gen(function*() {
1226
+ const result1 = yield* pull
1227
+ yield* Deferred.succeed(latch1, void 0)
1228
+ yield* Deferred.await(latch2)
1229
+ yield* pull.pipe(
1230
+ Effect.tap((chunk) =>
1231
+ Effect.sync(() => {
1232
+ arr.push(...chunk)
1233
+ })
1234
+ ),
1235
+ Effect.repeat({ times: 7 })
1236
+ )
1237
+ const result2 = arr.slice()
1238
+ yield* Deferred.succeed(latch3, void 0)
1239
+ yield* Deferred.await(latch4)
1240
+ yield* pull.pipe(
1241
+ Effect.tap((chunk) =>
1242
+ Effect.sync(() => {
1243
+ arr.push(...chunk)
1244
+ })
1245
+ ),
1246
+ Effect.repeat({ times: 7 })
1247
+ )
1248
+ const result3 = arr.slice()
1249
+ return { result1, result2, result3 }
1250
+ })
1251
+ ),
1252
+ Effect.scoped
1253
+ )
1254
+ const expected1 = Array.of(0)
1255
+ const expected2 = [1, 2, 3, 4, 5, 6, 7, 8]
1256
+ const expected3 = [1, 2, 3, 4, 5, 6, 7, 8, 17, 18, 19, 20, 21, 22, 23, 24]
1257
+ assert.deepStrictEqual(result1, expected1)
1258
+ assert.deepStrictEqual(result2, expected2)
1259
+ assert.deepStrictEqual(result3, expected3)
1260
+ }))
1261
+
1262
+ it.effect("buffers a stream with a failure", () =>
1263
+ Effect.gen(function*() {
1264
+ const error = "boom"
1265
+ const result = yield* pipe(
1266
+ Stream.range(1, 1_000),
1267
+ Stream.concat(Stream.fail(error)),
1268
+ Stream.concat(Stream.range(1_000, 2_000)),
1269
+ Stream.buffer({ capacity: 2, strategy: "dropping" }),
1270
+ Stream.runCollect,
1271
+ Effect.exit
1272
+ )
1273
+ assert.deepStrictEqual(result, Exit.fail(error))
1274
+ }))
1275
+
1276
+ it.effect("fast producer progress independently", () =>
1277
+ Effect.gen(function*() {
1278
+ const ref = yield* Ref.make(Array.empty<number>())
1279
+ const latch1 = yield* Deferred.make<void>()
1280
+ const latch2 = yield* Deferred.make<void>()
1281
+ const latch3 = yield* Deferred.make<void>()
1282
+ const latch4 = yield* Deferred.make<void>()
1283
+ const stream1 = pipe(
1284
+ Stream.make(0),
1285
+ Stream.concat(
1286
+ pipe(
1287
+ Stream.fromEffect(Deferred.await(latch1)),
1288
+ Stream.flatMap(() =>
1289
+ pipe(
1290
+ Stream.range(1, 17),
1291
+ Stream.rechunk(1),
1292
+ Stream.ensuring(Deferred.succeed(latch2, void 0))
1293
+ )
1294
+ )
1295
+ )
1296
+ )
1297
+ )
1298
+ const stream2 = pipe(
1299
+ Stream.fromEffect(Deferred.await(latch3)),
1300
+ Stream.flatMap(() =>
1301
+ pipe(
1302
+ Stream.range(17, 24),
1303
+ Stream.rechunk(1),
1304
+ Stream.ensuring(Deferred.succeed(latch4, void 0))
1305
+ )
1306
+ )
1307
+ )
1308
+ const stream3 = Stream.make(-1)
1309
+ const stream = pipe(
1310
+ stream1,
1311
+ Stream.concat(stream2),
1312
+ Stream.concat(stream3),
1313
+ Stream.buffer({ capacity: 8, strategy: "dropping" })
1314
+ )
1315
+ const { result1, result2, result3 } = yield* pipe(
1316
+ Stream.toPull(stream),
1317
+ Effect.flatMap((pull) =>
1318
+ Effect.gen(function*() {
1319
+ const result1 = yield* pull
1320
+ yield* Deferred.succeed(latch1, void 0)
1321
+ yield* Deferred.await(latch2)
1322
+ yield* pipe(
1323
+ pull,
1324
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk)))
1325
+ )
1326
+ const result2 = yield* Ref.get(ref)
1327
+ yield* Deferred.succeed(latch3, void 0)
1328
+ yield* Deferred.await(latch4)
1329
+ yield* pipe(
1330
+ pull,
1331
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk)))
1332
+ )
1333
+ const result3 = yield* (Ref.get(ref))
1334
+ return { result1, result2, result3 }
1335
+ })
1336
+ ),
1337
+ Effect.scoped
1338
+ )
1339
+ const expected1 = [0] as const
1340
+ const expected2 = [1, 2, 3, 4, 5, 6, 7, 8]
1341
+ const expected3 = [1, 2, 3, 4, 5, 6, 7, 8, 17, 18, 19, 20, 21, 22, 23, 24]
1342
+ deepStrictEqual(result1, expected1)
1343
+ deepStrictEqual(result2, expected2)
1344
+ deepStrictEqual(result3, expected3)
1345
+ }))
1346
+ })
1347
+
1348
+ describe("bufferArray - sliding", () => {
1349
+ it.effect("buffers a stream with a failure", () =>
1350
+ Effect.gen(function*() {
1351
+ const error = "boom"
1352
+ const result = yield* Stream.range(1, 1_000).pipe(
1353
+ Stream.concat(Stream.fail(error)),
1354
+ Stream.concat(Stream.range(1_001, 2_000)),
1355
+ Stream.bufferArray({ capacity: 2, strategy: "sliding" }),
1356
+ Stream.runCollect,
1357
+ Effect.exit
1358
+ )
1359
+ assertExitFailure(result, Cause.fail(error))
1360
+ }))
1361
+
1362
+ it.effect("fast producer progress independently", () =>
1363
+ Effect.gen(function*() {
1364
+ const ref = yield* Ref.make(Array.empty<number>())
1365
+
1366
+ const latch1 = yield* Deferred.make<void>()
1367
+ const latch2 = yield* Deferred.make<void>()
1368
+ const latch3 = yield* Deferred.make<void>()
1369
+ const latch4 = yield* Deferred.make<void>()
1370
+ const latch5 = yield* Deferred.make<void>()
1371
+ const stream1 = Stream.make(0).pipe(
1372
+ Stream.concat(
1373
+ pipe(
1374
+ Stream.fromEffect(Deferred.await(latch1)),
1375
+ Stream.flatMap(() =>
1376
+ pipe(
1377
+ Stream.range(1, 16),
1378
+ Stream.rechunk(1),
1379
+ Stream.ensuring(Deferred.succeed(latch2, void 0))
1380
+ )
1381
+ )
1382
+ )
1383
+ )
1384
+ )
1385
+ const stream2 = pipe(
1386
+ Stream.fromEffect(Deferred.await(latch3)),
1387
+ Stream.flatMap(() =>
1388
+ pipe(
1389
+ Stream.range(17, 25),
1390
+ Stream.rechunk(1),
1391
+ Stream.ensuring(Deferred.succeed(latch4, void 0))
1392
+ )
1393
+ )
1394
+ )
1395
+ const stream3 = pipe(
1396
+ Stream.fromEffect(Deferred.await(latch5)),
1397
+ Stream.flatMap(() => Stream.make(-1))
1398
+ )
1399
+ const stream = pipe(
1400
+ stream1,
1401
+ Stream.concat(stream2),
1402
+ Stream.concat(stream3),
1403
+ Stream.bufferArray({ capacity: 8, strategy: "sliding" })
1404
+ )
1405
+ const { result1, result2, result3 } = yield* pipe(
1406
+ Stream.toPull(stream),
1407
+ Effect.flatMap((pull) =>
1408
+ Effect.gen(function*() {
1409
+ const result1 = yield* pull
1410
+ yield* Deferred.succeed(latch1, void 0)
1411
+ yield* Deferred.await(latch2)
1412
+ yield* pipe(
1413
+ pull,
1414
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk))),
1415
+ Effect.repeat({ times: 7 })
1416
+ )
1417
+ const result2 = yield* Ref.get(ref)
1418
+ yield* Deferred.succeed(latch3, void 0)
1419
+ yield* Deferred.await(latch4)
1420
+ yield* pipe(
1421
+ pull,
1422
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk))),
1423
+ Effect.repeat({ times: 7 })
1424
+ )
1425
+ const result3 = yield* (Ref.get(ref))
1426
+ return { result1, result2, result3 }
1427
+ })
1428
+ ),
1429
+ Effect.scoped
1430
+ )
1431
+ const expected1 = [0]
1432
+ const expected2 = [9, 10, 11, 12, 13, 14, 15, 16]
1433
+ const expected3 = [9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25]
1434
+ assert.deepStrictEqual(Array.fromIterable(result1), expected1)
1435
+ assert.deepStrictEqual(Array.fromIterable(result2), expected2)
1436
+ assert.deepStrictEqual(Array.fromIterable(result3), expected3)
1437
+ }))
1438
+
1439
+ it.effect("buffers a stream with a failure", () =>
1440
+ Effect.gen(function*() {
1441
+ const error = "boom"
1442
+ const result = yield* pipe(
1443
+ Stream.range(1, 1_000),
1444
+ Stream.concat(Stream.fail(error)),
1445
+ Stream.concat(Stream.range(1_001, 2_000)),
1446
+ Stream.buffer({ capacity: 2, strategy: "sliding" }),
1447
+ Stream.runCollect,
1448
+ Effect.exit
1449
+ )
1450
+ deepStrictEqual(result, Exit.fail(error))
1451
+ }))
1452
+
1453
+ it.effect("fast producer progress independently", () =>
1454
+ Effect.gen(function*() {
1455
+ const ref = yield* Ref.make(Array.empty<number>())
1456
+ const latch1 = yield* Deferred.make<void>()
1457
+ const latch2 = yield* Deferred.make<void>()
1458
+ const latch3 = yield* Deferred.make<void>()
1459
+ const latch4 = yield* Deferred.make<void>()
1460
+ const stream1 = pipe(
1461
+ Stream.make(0),
1462
+ Stream.concat(
1463
+ pipe(
1464
+ Stream.fromEffect(Deferred.await(latch1)),
1465
+ Stream.flatMap(() =>
1466
+ pipe(
1467
+ Stream.range(1, 16),
1468
+ Stream.rechunk(1),
1469
+ Stream.ensuring(Deferred.succeed(latch2, void 0))
1470
+ )
1471
+ )
1472
+ )
1473
+ )
1474
+ )
1475
+ const stream2 = pipe(
1476
+ Stream.fromEffect(Deferred.await(latch3)),
1477
+ Stream.flatMap(() =>
1478
+ pipe(
1479
+ Stream.range(17, 24),
1480
+ Stream.rechunk(1),
1481
+ Stream.ensuring(Deferred.succeed(latch4, void 0))
1482
+ )
1483
+ )
1484
+ )
1485
+ const stream3 = Stream.make(-1)
1486
+ const stream = pipe(
1487
+ stream1,
1488
+ Stream.concat(stream2),
1489
+ Stream.concat(stream3),
1490
+ Stream.buffer({ capacity: 8, strategy: "sliding" })
1491
+ )
1492
+ const { result1, result2, result3 } = yield* pipe(
1493
+ Stream.toPull(stream),
1494
+ Effect.flatMap((pull) =>
1495
+ Effect.gen(function*() {
1496
+ const result1 = yield* pull
1497
+ yield* Deferred.succeed(latch1, void 0)
1498
+ yield* Deferred.await(latch2)
1499
+ yield* pipe(
1500
+ pull,
1501
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk)))
1502
+ )
1503
+ const result2 = yield* (Ref.get(ref))
1504
+ yield* (Deferred.succeed(latch3, void 0))
1505
+ yield* (Deferred.await(latch4))
1506
+ yield* pipe(
1507
+ pull,
1508
+ Effect.flatMap((chunk) => Ref.update(ref, Array.appendAll(chunk))),
1509
+ Effect.repeat({ times: 7 })
1510
+ )
1511
+ const result3 = yield* (Ref.get(ref))
1512
+ return { result1, result2, result3 }
1513
+ })
1514
+ ),
1515
+ Effect.scoped
1516
+ )
1517
+ const expected1 = [0] as const
1518
+ const expected2 = [9, 10, 11, 12, 13, 14, 15, 16]
1519
+ const expected3 = [9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, -1]
1520
+ deepStrictEqual(result1, expected1)
1521
+ deepStrictEqual(result2, expected2)
1522
+ deepStrictEqual(result3, expected3)
1523
+ }))
1524
+
1525
+ it.effect("propagates defects", () =>
1526
+ Effect.gen(function*() {
1527
+ const result = yield* pipe(
1528
+ Stream.fromEffect(Effect.die("boom")),
1529
+ Stream.buffer({ capacity: 1, strategy: "sliding" }),
1530
+ Stream.runDrain,
1531
+ Effect.exit
1532
+ )
1533
+ deepStrictEqual(result, Exit.die("boom"))
1534
+ }))
1535
+ })
1536
+
1537
+ describe("buffer - unbounded", () => {
1538
+ it.effect("buffer - buffers the stream", () =>
1539
+ Effect.gen(function*() {
1540
+ const chunk = Array.range(0, 10)
1541
+ const result = yield* pipe(
1542
+ Stream.fromIterable(chunk),
1543
+ Stream.buffer({ capacity: "unbounded" }),
1544
+ Stream.runCollect
1545
+ )
1546
+ deepStrictEqual(result, chunk)
1547
+ }))
1548
+
1549
+ it.effect("buffers a stream with a failure", () =>
1550
+ Effect.gen(function*() {
1551
+ const error = "boom"
1552
+ const result = yield* pipe(
1553
+ Stream.range(0, 9),
1554
+ Stream.concat(Stream.fail(error)),
1555
+ Stream.buffer({ capacity: "unbounded" }),
1556
+ Stream.runCollect,
1557
+ Effect.exit
1558
+ )
1559
+ deepStrictEqual(result, Exit.fail(error))
1560
+ }))
1561
+
1562
+ it.effect("fast producer progress independently", () =>
1563
+ Effect.gen(function*() {
1564
+ const ref = yield* Ref.make(Array.empty<number>())
1565
+ const latch = yield* Deferred.make<void>()
1566
+ const stream = pipe(
1567
+ Stream.range(1, 999),
1568
+ Stream.tap((n) =>
1569
+ pipe(
1570
+ Ref.update(ref, Array.append(n)),
1571
+ Effect.andThen(pipe(Deferred.succeed(latch, void 0), Effect.when(Effect.sync(() => n === 999))))
1572
+ )
1573
+ ),
1574
+ Stream.rechunk(999),
1575
+ Stream.buffer({ capacity: "unbounded" })
1576
+ )
1577
+ const result1 = yield* pipe(stream, Stream.take(2), Stream.runCollect)
1578
+ yield* Deferred.await(latch)
1579
+ const result2 = yield* Ref.get(ref)
1580
+ deepStrictEqual(result1, [1, 2])
1581
+ deepStrictEqual(result2, Array.range(1, 999))
1582
+ }))
1583
+ })
1584
+
1585
+ describe("share", () => {
1586
+ it.effect("sequenced", () =>
1587
+ Effect.gen(function*() {
1588
+ const sharedStream = yield* Stream.fromSchedule(Schedule.spaced("1 seconds")).pipe(
1589
+ Stream.share({ capacity: 16 })
1590
+ )
1591
+
1592
+ const firstFiber = yield* sharedStream.pipe(
1593
+ Stream.take(1),
1594
+ Stream.run(Sink.collect()),
1595
+ Effect.forkChild({ startImmediately: true })
1596
+ )
1597
+
1598
+ yield* TestClock.adjust("1 seconds")
1599
+
1600
+ const first = yield* Fiber.join(firstFiber)
1601
+ deepStrictEqual(first, [0])
1602
+
1603
+ const secondFiber = yield* sharedStream.pipe(
1604
+ Stream.take(1),
1605
+ Stream.run(Sink.collect()),
1606
+ Effect.forkChild({ startImmediately: true })
1607
+ )
1608
+
1609
+ yield* TestClock.adjust("1 seconds")
1610
+
1611
+ const second = yield* Fiber.join(secondFiber)
1612
+ deepStrictEqual(second, [0])
1613
+ }))
1614
+
1615
+ it.effect("sequenced with idleTimeToLive", () =>
1616
+ Effect.gen(function*() {
1617
+ const sharedStream = yield* Stream.fromSchedule(Schedule.spaced("1 seconds")).pipe(
1618
+ Stream.share({
1619
+ capacity: 16,
1620
+ idleTimeToLive: "1 second"
1621
+ })
1622
+ )
1623
+
1624
+ const firstFiber = yield* sharedStream.pipe(
1625
+ Stream.take(1),
1626
+ Stream.run(Sink.collect()),
1627
+ Effect.forkChild({ startImmediately: true })
1628
+ )
1629
+
1630
+ yield* TestClock.adjust("1 seconds")
1631
+
1632
+ const first = yield* Fiber.join(firstFiber)
1633
+ deepStrictEqual(first, [0])
1634
+
1635
+ const secondFiber = yield* sharedStream.pipe(
1636
+ Stream.take(1),
1637
+ Stream.run(Sink.collect()),
1638
+ Effect.forkChild({ startImmediately: true })
1639
+ )
1640
+
1641
+ yield* TestClock.adjust("1 seconds")
1642
+
1643
+ const second = yield* Fiber.join(secondFiber)
1644
+ deepStrictEqual(second, [1])
1645
+ }))
1646
+
1647
+ it.effect("parallel", () =>
1648
+ Effect.gen(function*() {
1649
+ const sharedStream = yield* Stream.fromSchedule(Schedule.spaced("1 seconds")).pipe(
1650
+ Stream.share({ capacity: 16 })
1651
+ )
1652
+
1653
+ const fiber1 = yield* sharedStream.pipe(
1654
+ Stream.take(1),
1655
+ Stream.run(Sink.collect()),
1656
+ Effect.forkChild({ startImmediately: true })
1657
+ )
1658
+ const fiber2 = yield* sharedStream.pipe(
1659
+ Stream.take(2),
1660
+ Stream.run(Sink.collect()),
1661
+ Effect.forkChild({ startImmediately: true })
1662
+ )
1663
+
1664
+ yield* TestClock.adjust("2 seconds")
1665
+
1666
+ const [result1, result2] = yield* Fiber.joinAll([fiber1, fiber2])
1667
+
1668
+ deepStrictEqual(result1, [0])
1669
+ deepStrictEqual(result2, [0, 1])
1670
+ }))
1671
+ })
1672
+
1673
+ describe("raceAll", () => {
1674
+ it.effect("sync", () =>
1675
+ Effect.gen(function*() {
1676
+ const result = yield* pipe(
1677
+ Stream.raceAll(
1678
+ Stream.make(0, 1, 2, 3),
1679
+ Stream.make(4, 5, 6, 7),
1680
+ Stream.make(7, 8, 9, 10)
1681
+ ),
1682
+ Stream.runCollect
1683
+ )
1684
+ deepStrictEqual(result, [0, 1, 2, 3])
1685
+ }))
1686
+
1687
+ it.effect("async", () =>
1688
+ Effect.gen(function*() {
1689
+ const fiber = yield* pipe(
1690
+ Stream.raceAll(
1691
+ Stream.fromSchedule(Schedule.spaced("1 second")),
1692
+ Stream.fromSchedule(Schedule.spaced("2 second"))
1693
+ ),
1694
+ Stream.take(5),
1695
+ Stream.runCollect,
1696
+ Effect.forkScoped
1697
+ )
1698
+ yield* TestClock.adjust("5 second")
1699
+ const result = yield* Fiber.join(fiber)
1700
+ deepStrictEqual(result, [0, 1, 2, 3, 4])
1701
+ }))
1702
+
1703
+ it.effect("combined async + sync", () =>
1704
+ Effect.gen(function*() {
1705
+ const result = yield* pipe(
1706
+ Stream.raceAll(
1707
+ Stream.fromSchedule(Schedule.spaced("1 second")),
1708
+ Stream.make(0, 1, 2, 3)
1709
+ ),
1710
+ Stream.runCollect
1711
+ )
1712
+ deepStrictEqual(result, [0, 1, 2, 3])
1713
+ }))
1714
+
1715
+ it.effect("combined sync + async", () =>
1716
+ Effect.gen(function*() {
1717
+ const result = yield* pipe(
1718
+ Stream.raceAll(
1719
+ Stream.make(0, 1, 2, 3),
1720
+ Stream.fromSchedule(Schedule.spaced("1 second"))
1721
+ ),
1722
+ Stream.runCollect
1723
+ )
1724
+ deepStrictEqual(result, [0, 1, 2, 3])
1725
+ }))
1726
+ })
1727
+
1728
+ it.effect("onStart", () =>
1729
+ Effect.gen(function*() {
1730
+ let counter = 0
1731
+ const result = yield* pipe(
1732
+ Stream.make(1, 1),
1733
+ Stream.onStart(Effect.sync(() => counter++)),
1734
+ Stream.runCollect
1735
+ )
1736
+ strictEqual(counter, 1)
1737
+ deepStrictEqual(result, [1, 1])
1738
+ }))
1739
+
1740
+ it.effect("onEnd", () =>
1741
+ Effect.gen(function*() {
1742
+ let counter = 0
1743
+ const result = yield* pipe(
1744
+ Stream.make(1, 2, 3),
1745
+ Stream.onEnd(Effect.sync(() => counter++)),
1746
+ Stream.runCollect
1747
+ )
1748
+ strictEqual(counter, 1)
1749
+ deepStrictEqual(result, [1, 2, 3])
1750
+ }))
1751
+
1752
+ describe("groupAdjacentBy", () => {
1753
+ it.effect("one big chunk", () =>
1754
+ Effect.gen(function*() {
1755
+ const result = yield* pipe(
1756
+ Stream.fromIterable([
1757
+ { code: 1, message: "A" },
1758
+ { code: 1, message: "B" },
1759
+ { code: 1, message: "D" },
1760
+ { code: 2, message: "C" }
1761
+ ]),
1762
+ Stream.groupAdjacentBy((x) => x.code),
1763
+ Stream.runCollect
1764
+ )
1765
+ deepStrictEqual(
1766
+ result.map(([, chunk]) => chunk),
1767
+ [
1768
+ [
1769
+ { code: 1, message: "A" },
1770
+ { code: 1, message: "B" },
1771
+ { code: 1, message: "D" }
1772
+ ],
1773
+ [
1774
+ { code: 2, message: "C" }
1775
+ ]
1776
+ ]
1777
+ )
1778
+ }))
1779
+
1780
+ it.effect("several single element chunks", () =>
1781
+ Effect.gen(function*() {
1782
+ const result = yield* pipe(
1783
+ Stream.fromArrays(
1784
+ [{ code: 1, message: "A" }],
1785
+ [{ code: 1, message: "B" }],
1786
+ [{ code: 1, message: "D" }],
1787
+ [{ code: 2, message: "C" }]
1788
+ ),
1789
+ Stream.groupAdjacentBy((x) => x.code),
1790
+ Stream.runCollect
1791
+ )
1792
+ deepStrictEqual(
1793
+ result.map(([, chunk]) => chunk),
1794
+ [
1795
+ [
1796
+ { code: 1, message: "A" },
1797
+ { code: 1, message: "B" },
1798
+ { code: 1, message: "D" }
1799
+ ],
1800
+ [
1801
+ { code: 2, message: "C" }
1802
+ ]
1803
+ ]
1804
+ )
1805
+ }))
1806
+
1807
+ it.effect("group across chunks", () =>
1808
+ Effect.gen(function*() {
1809
+ const result = yield* pipe(
1810
+ Stream.fromArrays(
1811
+ [{ code: 1, message: "A" }, { code: 1, message: "B" }],
1812
+ [{ code: 1, message: "D" }, { code: 2, message: "C" }]
1813
+ ),
1814
+ Stream.groupAdjacentBy((x) => x.code),
1815
+ Stream.runCollect
1816
+ )
1817
+ deepStrictEqual(
1818
+ result.map(([, chunk]) => chunk),
1819
+ [
1820
+ [
1821
+ { code: 1, message: "A" },
1822
+ { code: 1, message: "B" },
1823
+ { code: 1, message: "D" }
1824
+ ],
1825
+ [
1826
+ { code: 2, message: "C" }
1827
+ ]
1828
+ ]
1829
+ )
1830
+ }))
1831
+ })
1832
+
1833
+ describe("aggregateWithin", () => {
1834
+ it.effect("groupedWithin does not emit empty arrays when upstream is idle", () =>
1835
+ Effect.gen(function*() {
1836
+ const fiber = yield* Stream.never.pipe(
1837
+ Stream.groupedWithin(25, "50 millis"),
1838
+ Stream.take(5),
1839
+ Stream.runCollect,
1840
+ Effect.forkChild({ startImmediately: true })
1841
+ )
1842
+ yield* TestClock.adjust("1 second")
1843
+ assert.isUndefined(fiber.pollUnsafe())
1844
+ }))
1845
+
1846
+ it.effect("groupedWithin flushes final partial batch on upstream end without waiting for the schedule", () =>
1847
+ Effect.gen(function*() {
1848
+ const result = yield* Stream.make(1, 2, 3, 4, 5).pipe(
1849
+ Stream.groupedWithin(3, "1 second"),
1850
+ Stream.runCollect
1851
+ )
1852
+ deepStrictEqual(result, [[1, 2, 3], [4, 5]])
1853
+ }))
1854
+
1855
+ it.effect("groupedWithin flushes partial batch when the schedule elapses while upstream is idle", () =>
1856
+ Effect.gen(function*() {
1857
+ const fiber = yield* Stream.make(1, 2, 3, 4, 5).pipe(
1858
+ Stream.concat(Stream.never),
1859
+ Stream.groupedWithin(3, "1 second"),
1860
+ Stream.take(2),
1861
+ Stream.runCollect,
1862
+ Effect.forkChild({ startImmediately: true })
1863
+ )
1864
+ yield* TestClock.adjust("1 second")
1865
+ const result = yield* Fiber.join(fiber)
1866
+ deepStrictEqual(result, [[1, 2, 3], [4, 5]])
1867
+ }))
1868
+
1869
+ it.effect("simple example", () =>
1870
+ Effect.gen(function*() {
1871
+ const result = yield* pipe(
1872
+ Stream.make(1, 1, 1, 1, 2, 2),
1873
+ Stream.aggregateWithin(
1874
+ pipe(
1875
+ Sink.fold(
1876
+ () => [[] as Array<number>, true] as readonly [Array<number>, boolean],
1877
+ (tuple) => tuple[1],
1878
+ ([array], curr: number) =>
1879
+ Effect.succeed<readonly [Array<number>, boolean]>(
1880
+ curr === 1 ? [[curr, ...array], true] : [[curr, ...array], false]
1881
+ )
1882
+ ),
1883
+ Sink.map((tuple) => tuple[0])
1884
+ ),
1885
+ Schedule.spaced(Duration.minutes(30))
1886
+ ),
1887
+ Stream.runCollect
1888
+ )
1889
+ deepStrictEqual(result, [[2, 1, 1, 1, 1], [2]])
1890
+ }))
1891
+
1892
+ it.effect("fails fast", () =>
1893
+ Effect.gen(function*() {
1894
+ const queue = yield* Queue.unbounded<number>()
1895
+ yield* pipe(
1896
+ Stream.range(1, 9),
1897
+ Stream.tap((n) =>
1898
+ pipe(
1899
+ Effect.fail("Boom"),
1900
+ Effect.when(Effect.sync(() => n === 6)),
1901
+ Effect.andThen(Queue.offer(queue, n))
1902
+ )
1903
+ ),
1904
+ Stream.aggregateWithin(
1905
+ Sink.foldUntil(constVoid, 5, () => Effect.void),
1906
+ Schedule.forever
1907
+ ),
1908
+ Stream.runDrain,
1909
+ Effect.catch(() => Effect.void)
1910
+ )
1911
+ const result = yield* Queue.takeAll(queue)
1912
+ yield* Queue.shutdown(queue)
1913
+ deepStrictEqual(result, [1, 2, 3, 4, 5])
1914
+ }))
1915
+
1916
+ it.effect("error propagation #1", () =>
1917
+ Effect.gen(function*() {
1918
+ const error = new Error("Boom")
1919
+ const result = yield* pipe(
1920
+ Stream.make(1, 1, 1, 1),
1921
+ Stream.aggregateWithin(
1922
+ Sink.die(error),
1923
+ Schedule.spaced(Duration.minutes(30))
1924
+ ),
1925
+ Stream.runCollect,
1926
+ Effect.exit
1927
+ )
1928
+ deepStrictEqual(result, Exit.die(error))
1929
+ }))
1930
+
1931
+ it.effect("error propagation #2", () =>
1932
+ Effect.gen(function*() {
1933
+ const error = new Error("Boom")
1934
+ const result = yield* pipe(
1935
+ Stream.make(1, 1),
1936
+ Stream.aggregateWithin(
1937
+ Sink.fold(() => [], constTrue, () => Effect.die(error)),
1938
+ Schedule.spaced(Duration.minutes(30))
1939
+ ),
1940
+ Stream.runCollect,
1941
+ Effect.exit
1942
+ )
1943
+ deepStrictEqual(result, Exit.die(error))
1944
+ }))
1945
+
1946
+ it.effect("interruption propagation #1", () =>
1947
+ Effect.gen(function*() {
1948
+ const latch = yield* Deferred.make<void>()
1949
+ const ref = yield* Ref.make(false)
1950
+ const sink = Sink.fold(Array.empty<number>, constTrue, (acc, curr: number) => {
1951
+ if (curr === 1) {
1952
+ acc.push(curr)
1953
+ return Effect.succeed(acc)
1954
+ }
1955
+ return pipe(
1956
+ Deferred.succeed(latch, void 0),
1957
+ Effect.andThen(Effect.never),
1958
+ Effect.onInterrupt(() => Ref.set(ref, true))
1959
+ )
1960
+ })
1961
+ const fiber = yield* pipe(
1962
+ Stream.make(1, 1, 2),
1963
+ Stream.aggregateWithin(sink, Schedule.spaced(Duration.minutes(30))),
1964
+ Stream.runCollect,
1965
+ Effect.forkScoped
1966
+ )
1967
+ yield* Deferred.await(latch)
1968
+ yield* Fiber.interrupt(fiber)
1969
+ const result = yield* Ref.get(ref)
1970
+ assertTrue(result)
1971
+ }))
1972
+
1973
+ it.effect("interruption propagation #2", () =>
1974
+ Effect.gen(function*() {
1975
+ const ref = yield* Ref.make(false)
1976
+ const sink = Sink.fromEffect(
1977
+ Effect.never.pipe(
1978
+ Effect.onInterrupt(() => Ref.set(ref, true))
1979
+ )
1980
+ )
1981
+ const fiber = yield* Stream.make(1, 1, 2).pipe(
1982
+ Stream.aggregateWithin(sink, Schedule.spaced(Duration.minutes(30))),
1983
+ Stream.runCollect,
1984
+ Effect.forkScoped({ startImmediately: true })
1985
+ )
1986
+ yield* Fiber.interrupt(fiber)
1987
+ const result = yield* Ref.get(ref)
1988
+ assertTrue(result)
1989
+ }))
1990
+
1991
+ // it.effect("leftover handling", () =>
1992
+ // Effect.gen(function*() {
1993
+ // const input = [1, 2, 2, 3, 2, 3]
1994
+ // const fiber = yield* pipe(
1995
+ // Stream.fromIterable(input),
1996
+ // Stream.aggregateWithin(
1997
+ // Sink.foldWeighted({
1998
+ // initial: Chunk.empty<number>(),
1999
+ // maxCost: 4,
2000
+ // cost: (_, n) => n,
2001
+ // body: (acc, curr) => Chunk.append(acc, curr)
2002
+ // }),
2003
+ // Schedule.spaced(Duration.millis(100))
2004
+ // ),
2005
+ // Stream.flattenIterable,
2006
+ // Stream.runCollect,
2007
+ // Effect.forkScoped
2008
+ // )
2009
+ // yield* TestClock.adjust(Duration.minutes(31))
2010
+ // const result = yield* Fiber.join(fiber)
2011
+ // deepStrictEqual(result, input)
2012
+ // }))
2013
+ })
2014
+
2015
+ describe("debounce", () => {
2016
+ it.effect("should drop earlier chunks within waitTime", () =>
2017
+ Effect.gen(function*() {
2018
+ const coordination = yield* chunkCoordination([
2019
+ [1],
2020
+ [3, 4],
2021
+ [5],
2022
+ [6, 7]
2023
+ ])
2024
+ const stream = pipe(
2025
+ coordination.stream,
2026
+ Stream.chunks,
2027
+ Stream.debounce(Duration.seconds(1))
2028
+ )
2029
+ const fiber = yield* pipe(stream, Stream.runCollect, Effect.forkScoped)
2030
+ yield* coordination.offer
2031
+ yield* pipe(
2032
+ Effect.sleep(Duration.millis(500)),
2033
+ Effect.andThen(coordination.offer),
2034
+ Effect.forkScoped
2035
+ )
2036
+ yield* pipe(
2037
+ Effect.sleep(Duration.seconds(2)),
2038
+ Effect.andThen(coordination.offer),
2039
+ Effect.forkScoped
2040
+ )
2041
+ yield* pipe(
2042
+ Effect.sleep(Duration.millis(2500)),
2043
+ Effect.andThen(coordination.offer),
2044
+ Effect.forkScoped
2045
+ )
2046
+ yield* TestClock.adjust(Duration.millis(3500))
2047
+ const result = yield* Fiber.join(fiber)
2048
+ deepStrictEqual(
2049
+ result,
2050
+ [[3, 4], [6, 7]]
2051
+ )
2052
+ }))
2053
+
2054
+ it.effect("should take latest chunk within waitTime", () =>
2055
+ Effect.gen(function*() {
2056
+ const coordination = yield* chunkCoordination([
2057
+ [1, 2],
2058
+ [3, 4],
2059
+ [5, 6]
2060
+ ])
2061
+ const stream = pipe(
2062
+ coordination.stream,
2063
+ Stream.chunks,
2064
+ Stream.debounce(Duration.seconds(1))
2065
+ )
2066
+ const fiber = yield* pipe(stream, Stream.runCollect, Effect.forkScoped)
2067
+ yield* pipe(
2068
+ coordination.offer,
2069
+ Effect.andThen(coordination.offer),
2070
+ Effect.andThen(coordination.offer)
2071
+ )
2072
+ yield* TestClock.adjust(Duration.seconds(1))
2073
+ const result = yield* Fiber.join(fiber)
2074
+ deepStrictEqual(result, [[5, 6]])
2075
+ }))
2076
+
2077
+ it.effect("should work properly with parallelization", () =>
2078
+ Effect.gen(function*() {
2079
+ const coordination = yield* chunkCoordination([
2080
+ [1],
2081
+ [2],
2082
+ [3]
2083
+ ])
2084
+ const stream = pipe(
2085
+ coordination.stream,
2086
+ Stream.chunks,
2087
+ Stream.debounce(Duration.seconds(1))
2088
+ )
2089
+ const fiber = yield* pipe(stream, Stream.runCollect, Effect.forkScoped)
2090
+ yield* Effect.all([
2091
+ coordination.offer,
2092
+ coordination.offer,
2093
+ coordination.offer
2094
+ ], { concurrency: 3, discard: true })
2095
+ yield* TestClock.adjust(Duration.seconds(1))
2096
+ const result = yield* Fiber.join(fiber)
2097
+ deepStrictEqual(result, [[3]])
2098
+ }))
2099
+
2100
+ it.effect("should handle empty chunks properly", () =>
2101
+ Effect.gen(function*() {
2102
+ const fiber = yield* pipe(
2103
+ Stream.make(1, 2, 3),
2104
+ Stream.tap(() => Effect.sleep(Duration.millis(500))),
2105
+ Stream.debounce(Duration.seconds(1)),
2106
+ Stream.runCollect,
2107
+ Effect.forkScoped({ startImmediately: true })
2108
+ )
2109
+ yield* TestClock.adjust(Duration.seconds(3))
2110
+ const result = yield* Fiber.join(fiber)
2111
+ deepStrictEqual(result, [3])
2112
+ }))
2113
+
2114
+ it.effect("should fail immediately", () =>
2115
+ Effect.gen(function*() {
2116
+ const result = yield* pipe(
2117
+ Stream.fromEffect(Effect.fail(Option.none())),
2118
+ Stream.debounce(Duration.infinity),
2119
+ Stream.runCollect,
2120
+ Effect.exit
2121
+ )
2122
+ assertExitFailure(result, Cause.fail(Option.none()))
2123
+ }))
2124
+
2125
+ it.effect("should work with empty streams", () =>
2126
+ Effect.gen(function*() {
2127
+ const result = yield* pipe(
2128
+ Stream.empty,
2129
+ Stream.debounce(Duration.seconds(5)),
2130
+ Stream.runCollect
2131
+ )
2132
+ assertTrue(result.length === 0)
2133
+ }))
2134
+
2135
+ it.effect("should pick last element from every chunk", () =>
2136
+ Effect.gen(function*() {
2137
+ const fiber = yield* pipe(
2138
+ Stream.make(1, 2, 3),
2139
+ Stream.debounce(Duration.seconds(1)),
2140
+ Stream.runCollect,
2141
+ Effect.forkScoped
2142
+ )
2143
+ yield* TestClock.adjust(Duration.seconds(1))
2144
+ const result = yield* Fiber.join(fiber)
2145
+ deepStrictEqual(result, [3])
2146
+ }))
2147
+
2148
+ it.effect("should interrupt fibers properly", () =>
2149
+ Effect.gen(function*() {
2150
+ const coordination = yield* chunkCoordination([
2151
+ [1],
2152
+ [2],
2153
+ [3]
2154
+ ])
2155
+ const fiber = yield* pipe(
2156
+ coordination.stream,
2157
+ Stream.chunks,
2158
+ Stream.tap(() => coordination.proceed),
2159
+ Stream.flattenArray,
2160
+ Stream.debounce(Duration.millis(200)),
2161
+ // Stream.interruptWhen(Effect.never),
2162
+ Stream.take(1),
2163
+ Stream.runCollect,
2164
+ Effect.forkScoped
2165
+ )
2166
+ yield* pipe(
2167
+ coordination.offer,
2168
+ Effect.andThen(TestClock.adjust(Duration.millis(100))),
2169
+ Effect.andThen(coordination.awaitNext),
2170
+ Effect.repeat({ times: 2 })
2171
+ )
2172
+ yield* TestClock.adjust(Duration.millis(100))
2173
+ const result = yield* Fiber.join(fiber)
2174
+ deepStrictEqual(result, [3])
2175
+ }))
2176
+
2177
+ it.effect("should interrupt children fiber on stream interruption", () =>
2178
+ Effect.gen(function*() {
2179
+ const ref = yield* (Ref.make(false))
2180
+ const fiber = yield* pipe(
2181
+ Stream.fromEffect(Effect.void),
2182
+ Stream.concat(Stream.fromEffect(pipe(
2183
+ Effect.never,
2184
+ Effect.onInterrupt(() => Ref.set(ref, true))
2185
+ ))),
2186
+ Stream.debounce(Duration.millis(800)),
2187
+ Stream.runDrain,
2188
+ Effect.forkScoped
2189
+ )
2190
+ yield* TestClock.adjust(Duration.minutes(1))
2191
+ yield* Fiber.interrupt(fiber)
2192
+ const result = yield* Ref.get(ref)
2193
+ assertTrue(result)
2194
+ }))
2195
+ })
2196
+
2197
+ describe("throttle", () => {
2198
+ it.effect("throttleEnforce - free elements", () =>
2199
+ Effect.gen(function*() {
2200
+ const result = yield* pipe(
2201
+ Stream.make(1, 2, 3, 4),
2202
+ Stream.throttle({
2203
+ cost: () => 0,
2204
+ units: 0,
2205
+ duration: Duration.infinity,
2206
+ strategy: "enforce"
2207
+ }),
2208
+ Stream.runCollect
2209
+ )
2210
+ deepStrictEqual(result, [1, 2, 3, 4])
2211
+ }))
2212
+
2213
+ it.effect("throttleEnforce - no bandwidth", () =>
2214
+ Effect.gen(function*() {
2215
+ const result = yield* pipe(
2216
+ Stream.make(1, 2, 3, 4),
2217
+ Stream.throttle({
2218
+ cost: () => 1,
2219
+ units: 0,
2220
+ duration: Duration.infinity,
2221
+ strategy: "enforce"
2222
+ }),
2223
+ Stream.runCollect
2224
+ )
2225
+ assertTrue(result.length === 0)
2226
+ }))
2227
+
2228
+ it.effect("throttleEnforce - refill bucket tokens", () =>
2229
+ Effect.gen(function*() {
2230
+ const fiber = yield* pipe(
2231
+ Stream.fromSchedule(Schedule.spaced(Duration.millis(100))),
2232
+ Stream.take(10),
2233
+ Stream.throttle({
2234
+ cost: () => 1,
2235
+ units: 1,
2236
+ duration: Duration.millis(200),
2237
+ strategy: "enforce"
2238
+ }),
2239
+ Stream.runCollect,
2240
+ Effect.forkScoped
2241
+ )
2242
+ yield* TestClock.adjust(Duration.seconds(1))
2243
+ const result = yield* Fiber.join(fiber)
2244
+ deepStrictEqual(result, [0, 2, 4, 6, 8])
2245
+ }))
2246
+
2247
+ it.effect("throttleShape", () =>
2248
+ Effect.gen(function*() {
2249
+ const queue = yield* Queue.unbounded<number>()
2250
+ const fiber = yield* pipe(
2251
+ Stream.fromQueue(queue),
2252
+ Stream.throttle({
2253
+ strategy: "shape",
2254
+ cost: (arr) => arr.reduce((a, b) => a + b, 0),
2255
+ units: 1,
2256
+ duration: Duration.seconds(1)
2257
+ }),
2258
+ Stream.toPull,
2259
+ Effect.flatMap((pull) =>
2260
+ Effect.gen(function*() {
2261
+ yield* Queue.offer(queue, 1)
2262
+ const result1 = yield* pull
2263
+ yield* Queue.offer(queue, 2)
2264
+ const result2 = yield* pull
2265
+ yield* Effect.sleep(Duration.seconds(4))
2266
+ yield* Queue.offer(queue, 3)
2267
+ const result3 = yield* pull
2268
+ return [result1, result2, result3] as const
2269
+ })
2270
+ ),
2271
+ Effect.scoped,
2272
+ Effect.forkScoped
2273
+ )
2274
+ yield* TestClock.adjust(Duration.seconds(8))
2275
+ const result = yield* Fiber.join(fiber)
2276
+ deepStrictEqual(result, [[1], [2], [3]])
2277
+ }))
2278
+
2279
+ it.effect("throttleShape - infinite bandwidth", () =>
2280
+ Effect.gen(function*() {
2281
+ const queue = yield* Queue.unbounded<number>()
2282
+ const result = yield* pipe(
2283
+ Stream.fromQueue(queue),
2284
+ Stream.throttle({
2285
+ strategy: "shape",
2286
+ cost: () => 100_000,
2287
+ units: 1,
2288
+ duration: Duration.zero
2289
+ }),
2290
+ Stream.toPull,
2291
+ Effect.flatMap((pull) =>
2292
+ Effect.gen(function*() {
2293
+ yield* Queue.offer(queue, 1)
2294
+ const result1 = yield* pull
2295
+ yield* Queue.offer(queue, 2)
2296
+ const result2 = yield* pull
2297
+ return [result1, result2] as const
2298
+ })
2299
+ ),
2300
+ Effect.scoped
2301
+ )
2302
+ deepStrictEqual(result, [[1], [2]])
2303
+ }))
2304
+
2305
+ it.effect("throttleShape - with burst", () =>
2306
+ Effect.gen(function*() {
2307
+ const queue = yield* Queue.unbounded<number>()
2308
+ const fiber = yield* pipe(
2309
+ Stream.fromQueue(queue),
2310
+ Stream.throttle({
2311
+ strategy: "shape",
2312
+ cost: (arr) => arr.reduce((a, b) => a + b, 0),
2313
+ units: 1,
2314
+ duration: Duration.seconds(1),
2315
+ burst: 2
2316
+ }),
2317
+ Stream.toPull,
2318
+ Effect.flatMap((pull) =>
2319
+ Effect.gen(function*() {
2320
+ yield* Queue.offer(queue, 1)
2321
+ const result1 = yield* pull
2322
+ yield* TestClock.adjust(Duration.seconds(2))
2323
+ yield* Queue.offer(queue, 2)
2324
+ const result2 = yield* pull
2325
+ yield* TestClock.adjust(Duration.seconds(4))
2326
+ yield* Queue.offer(queue, 3)
2327
+ const result3 = yield* pull
2328
+ return [result1, result2, result3] as const
2329
+ })
2330
+ ),
2331
+ Effect.scoped,
2332
+ Effect.forkScoped
2333
+ )
2334
+ const result = yield* Fiber.join(fiber)
2335
+ deepStrictEqual(result, [[1], [2], [3]])
2336
+ }))
2337
+
2338
+ it.effect("throttleShape - free elements", () =>
2339
+ Effect.gen(function*() {
2340
+ const result = yield* pipe(
2341
+ Stream.make(1, 2, 3, 4),
2342
+ Stream.throttle({
2343
+ strategy: "shape",
2344
+ cost: () => 0,
2345
+ units: 1,
2346
+ duration: Duration.infinity
2347
+ }),
2348
+ Stream.runCollect
2349
+ )
2350
+ deepStrictEqual(result, [1, 2, 3, 4])
2351
+ }))
2352
+ })
2353
+
2354
+ describe("zipping", () => {
2355
+ it.effect("zipWith - combines elements point-wise", () =>
2356
+ Effect.gen(function*() {
2357
+ const stream1 = Stream.make(1, 2, 3)
2358
+ const stream2 = Stream.make("a", "b", "c")
2359
+ const result = yield* Stream.zipWith(stream1, stream2, (n, s) => `${n}-${s}`).pipe(
2360
+ Stream.runCollect
2361
+ )
2362
+ assert.deepStrictEqual(result, ["1-a", "2-b", "3-c"])
2363
+ }))
2364
+
2365
+ it.effect("zipWith - stops when shortest stream ends", () =>
2366
+ Effect.gen(function*() {
2367
+ const stream1 = Stream.make(1, 2, 3, 4, 5, 6)
2368
+ const stream2 = Stream.make("a", "b", "c")
2369
+ const result = yield* Stream.zipWith(stream1, stream2, (n, s) => `${n}-${s}`).pipe(
2370
+ Stream.runCollect
2371
+ )
2372
+ assert.deepStrictEqual(result, ["1-a", "2-b", "3-c"])
2373
+ }))
2374
+
2375
+ it.effect("zipWith - does not pull too much when one stream ends", () =>
2376
+ Effect.gen(function*() {
2377
+ const left = Stream.fromArrays([1, 2], [3, 4], [5]).pipe(
2378
+ Stream.concat(Stream.fail("boom"))
2379
+ )
2380
+ const right = Stream.fromArrays(["a", "b"], ["c"])
2381
+ const result = yield* Stream.zipWith(left, right, (n, s) => [n, s] as const).pipe(
2382
+ Stream.runCollect
2383
+ )
2384
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2385
+ }))
2386
+
2387
+ it.effect("zipWith - prioritizes failures", () =>
2388
+ Effect.gen(function*() {
2389
+ const result = yield* Stream.zipWith(
2390
+ Stream.never,
2391
+ Stream.fail("Ouch"),
2392
+ (a, b) => [a, b]
2393
+ ).pipe(
2394
+ Stream.runCollect,
2395
+ Effect.exit
2396
+ )
2397
+ assertExitFailure(result, Cause.fail("Ouch"))
2398
+ }))
2399
+
2400
+ it.effect("zipWith - handles exceptions", () =>
2401
+ Effect.gen(function*() {
2402
+ const error = new Error("Ouch")
2403
+ const result = yield* Stream.make(1).pipe(
2404
+ Stream.flatMap(() =>
2405
+ Stream.sync(() => {
2406
+ throw error
2407
+ })
2408
+ ),
2409
+ Stream.zipWith(Stream.make(1), (a, b) => [a, b]),
2410
+ Stream.runCollect,
2411
+ Effect.exit
2412
+ )
2413
+ assertExitFailure(result, Cause.die(error))
2414
+ }))
2415
+
2416
+ it.effect("zipWith - handles empty streams", () =>
2417
+ Effect.gen(function*() {
2418
+ const result1 = yield* Stream.zipWith(
2419
+ Stream.empty,
2420
+ Stream.make(1, 2, 3),
2421
+ (a, b) => [a, b]
2422
+ ).pipe(Stream.runCollect)
2423
+
2424
+ const result2 = yield* Stream.zipWith(
2425
+ Stream.make(1, 2, 3),
2426
+ Stream.empty,
2427
+ (a, b) => [a, b]
2428
+ ).pipe(Stream.runCollect)
2429
+
2430
+ assert.strictEqual(result1.length, 0)
2431
+ assert.strictEqual(result2.length, 0)
2432
+ }))
2433
+
2434
+ it.effect.prop(
2435
+ "zipWith - equivalence with array operations",
2436
+ {
2437
+ left: fc.array(fc.integer()),
2438
+ right: fc.array(fc.integer())
2439
+ },
2440
+ Effect.fnUntraced(function*({ left, right }) {
2441
+ const stream = Stream.zipWith(
2442
+ Stream.fromIterable(left),
2443
+ Stream.fromIterable(right),
2444
+ (a, b) => a + b
2445
+ )
2446
+ const result = yield* Stream.runCollect(stream)
2447
+
2448
+ const minLength = Math.min(left.length, right.length)
2449
+ const expected = Array.empty<number>()
2450
+ for (let i = 0; i < minLength; i++) {
2451
+ expected.push(left[i] + right[i])
2452
+ }
2453
+
2454
+ assert.deepStrictEqual(result, expected)
2455
+ })
2456
+ )
2457
+
2458
+ describe("zipWithArray", () => {
2459
+ it.effect("basic zipping with equal length streams", () =>
2460
+ Effect.gen(function*() {
2461
+ const stream1 = Stream.make(1, 2, 3)
2462
+ const stream2 = Stream.make("a", "b", "c")
2463
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2464
+ const minLength = Math.min(left.length, right.length)
2465
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2466
+ return [output, left.slice(minLength), right.slice(minLength)]
2467
+ }).pipe(Stream.runCollect)
2468
+
2469
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2470
+ }))
2471
+
2472
+ it.effect("left stream shorter than right", () =>
2473
+ Effect.gen(function*() {
2474
+ const stream1 = Stream.make(1, 2, 3)
2475
+ const stream2 = Stream.make("a", "b", "c", "d", "e")
2476
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2477
+ const minLength = Math.min(left.length, right.length)
2478
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2479
+ return [output, left.slice(minLength), right.slice(minLength)]
2480
+ }).pipe(Stream.runCollect)
2481
+
2482
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2483
+ }))
2484
+
2485
+ it.effect("right stream shorter than left", () =>
2486
+ Effect.gen(function*() {
2487
+ const stream1 = Stream.make(1, 2, 3, 4, 5)
2488
+ const stream2 = Stream.make("a", "b", "c")
2489
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2490
+ const minLength = Math.min(left.length, right.length)
2491
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2492
+ return [output, left.slice(minLength), right.slice(minLength)]
2493
+ }).pipe(Stream.runCollect)
2494
+
2495
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2496
+ }))
2497
+
2498
+ it.effect("multiple arrays from each stream", () =>
2499
+ Effect.gen(function*() {
2500
+ const stream1 = Stream.fromArrays([1, 2], [3, 4], [5, 6])
2501
+ const stream2 = Stream.fromArrays(["a", "b"], ["c", "d"], ["e", "f"])
2502
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2503
+ const minLength = Math.min(left.length, right.length)
2504
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2505
+ return [output, left.slice(minLength), right.slice(minLength)]
2506
+ }).pipe(Stream.runCollect)
2507
+
2508
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"], [4, "d"], [5, "e"], [6, "f"]])
2509
+ }))
2510
+
2511
+ it.effect("handles leftover elements correctly", () =>
2512
+ Effect.gen(function*() {
2513
+ const stream1 = Stream.fromArrays([1, 2, 3], [4, 5])
2514
+ const stream2 = Stream.fromArrays(["a", "b"], ["c", "d", "e"])
2515
+ let leftLeftovers = 0
2516
+ let rightLeftovers = 0
2517
+
2518
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2519
+ const minLength = Math.min(left.length, right.length)
2520
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2521
+ const leftSlice = left.slice(minLength)
2522
+ const rightSlice = right.slice(minLength)
2523
+ if (leftSlice.length > 0) {
2524
+ leftLeftovers++
2525
+ } else if (rightSlice.length > 0) {
2526
+ rightLeftovers++
2527
+ }
2528
+ return [output, leftSlice, rightSlice]
2529
+ }).pipe(Stream.runCollect)
2530
+
2531
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"], [4, "d"], [5, "e"]])
2532
+ assert.isTrue(leftLeftovers > 0 || rightLeftovers > 0)
2533
+ }))
2534
+
2535
+ it.effect("error propagation from left stream", () =>
2536
+ Effect.gen(function*() {
2537
+ const result = yield* Stream.zipWithArray(
2538
+ Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom"))),
2539
+ Stream.make("a", "b", "c"),
2540
+ (left, right) => {
2541
+ const minLength = Math.min(left.length, right.length)
2542
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2543
+ return [output, [], []]
2544
+ }
2545
+ ).pipe(Stream.runCollect, Effect.exit)
2546
+
2547
+ assertExitFailure(result, Cause.fail("boom"))
2548
+ }))
2549
+
2550
+ // Note: This test is skipped because with sequential pulling (matching zipWith behavior),
2551
+ // when the left stream ends, we don't pull from the right stream, so errors after
2552
+ // the left stream ends are not encountered. This is correct behavior.
2553
+ it.skip("error propagation from right stream", () =>
2554
+ Effect.gen(function*() {
2555
+ const result = yield* Stream.zipWithArray(
2556
+ Stream.make(1, 2, 3),
2557
+ Stream.make("a", "b").pipe(Stream.concat(Stream.fail("boom"))),
2558
+ (left, right) => {
2559
+ const minLength = Math.min(left.length, right.length)
2560
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2561
+ return [output, [], []]
2562
+ }
2563
+ ).pipe(Stream.runCollect, Effect.exit)
2564
+
2565
+ assertExitFailure(result, Cause.fail("boom"))
2566
+ }))
2567
+
2568
+ it.effect("handles empty streams", () =>
2569
+ Effect.gen(function*() {
2570
+ const result1 = yield* Stream.zipWithArray(
2571
+ Stream.empty,
2572
+ Stream.make(1, 2, 3),
2573
+ (left, right) => {
2574
+ return [Array.of([left[0], right[0]] as const), [], []]
2575
+ }
2576
+ ).pipe(Stream.runCollect)
2577
+
2578
+ const result2 = yield* Stream.zipWithArray(
2579
+ Stream.make(1, 2, 3),
2580
+ Stream.empty,
2581
+ (left, right) => {
2582
+ return [Array.of([left[0], right[0]] as const), [], []]
2583
+ }
2584
+ ).pipe(Stream.runCollect)
2585
+
2586
+ assert.strictEqual(result1.length, 0)
2587
+ assert.strictEqual(result2.length, 0)
2588
+ }))
2589
+
2590
+ it.effect("processes arrays of different sizes within streams", () =>
2591
+ Effect.gen(function*() {
2592
+ const stream1 = Stream.fromArrays([1], [2, 3, 4], [5])
2593
+ const stream2 = Stream.fromArrays([10, 20], [30], [40, 50])
2594
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2595
+ const minLength = Math.min(left.length, right.length)
2596
+ const output = Array.makeBy(minLength, (i: number) => [left[i], right[i]] as const)
2597
+ return [output, left.slice(minLength), right.slice(minLength)]
2598
+ }).pipe(Stream.runCollect)
2599
+
2600
+ assert.deepStrictEqual(result, [[1, 10], [2, 20], [3, 30], [4, 40], [5, 50]])
2601
+ }))
2602
+
2603
+ it.effect("custom array-level logic - take pairs", () =>
2604
+ Effect.gen(function*() {
2605
+ const stream1 = Stream.make(1, 2, 3, 4)
2606
+ const stream2 = Stream.make(10, 20, 30, 40)
2607
+ const result = yield* Stream.zipWithArray(stream1, stream2, (left, right) => {
2608
+ const pairs = Math.min(Math.floor(left.length / 2), Math.floor(right.length / 2))
2609
+ const output = Array.makeBy(pairs, (i: number) => {
2610
+ return [left[i * 2], left[i * 2 + 1], right[i * 2], right[i * 2 + 1]] as const
2611
+ })
2612
+
2613
+ const leftUsed = pairs * 2
2614
+ const rightUsed = pairs * 2
2615
+ const leftLeftover = left.slice(leftUsed)
2616
+ const rightLeftover = right.slice(rightUsed)
2617
+
2618
+ return [output, leftLeftover, rightLeftover]
2619
+ }).pipe(Stream.runCollect)
2620
+
2621
+ assert.deepStrictEqual(result, [[1, 2, 10, 20], [3, 4, 30, 40]])
2622
+ }))
2623
+
2624
+ it.effect("does not pull too much when one stream ends", () =>
2625
+ Effect.gen(function*() {
2626
+ const left = Stream.fromArrays([1, 2], [3, 4], [5]).pipe(
2627
+ Stream.concat(Stream.fail("boom"))
2628
+ )
2629
+ const right = Stream.fromArrays(["a", "b"], ["c"])
2630
+ const result = yield* Stream.zipWithArray(left, right, (leftArr, rightArr) => {
2631
+ const minLength = Math.min(leftArr.length, rightArr.length)
2632
+ const output = Array.makeBy(minLength, (i: number) => [leftArr[i], rightArr[i]] as const)
2633
+ return [output, leftArr.slice(minLength), rightArr.slice(minLength)]
2634
+ }).pipe(Stream.runCollect)
2635
+
2636
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2637
+ }))
2638
+ })
2639
+
2640
+ describe("zip", () => {
2641
+ it.effect("zips two streams into tuples", () =>
2642
+ Effect.gen(function*() {
2643
+ const stream1 = Stream.make(1, 2, 3)
2644
+ const stream2 = Stream.make("a", "b", "c")
2645
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect)
2646
+
2647
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2648
+ }))
2649
+
2650
+ it.effect("terminates when left stream ends first", () =>
2651
+ Effect.gen(function*() {
2652
+ const stream1 = Stream.make(1, 2)
2653
+ const stream2 = Stream.make("a", "b", "c", "d")
2654
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect)
2655
+
2656
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"]])
2657
+ }))
2658
+
2659
+ it.effect("terminates when right stream ends first", () =>
2660
+ Effect.gen(function*() {
2661
+ const stream1 = Stream.make(1, 2, 3, 4)
2662
+ const stream2 = Stream.make("a", "b")
2663
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect)
2664
+
2665
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"]])
2666
+ }))
2667
+
2668
+ it.effect("handles empty left stream", () =>
2669
+ Effect.gen(function*() {
2670
+ const stream1 = Stream.empty
2671
+ const stream2 = Stream.make("a", "b", "c")
2672
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect)
2673
+
2674
+ assert.strictEqual(result.length, 0)
2675
+ }))
2676
+
2677
+ it.effect("handles empty right stream", () =>
2678
+ Effect.gen(function*() {
2679
+ const stream1 = Stream.make(1, 2, 3)
2680
+ const stream2 = Stream.empty
2681
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect)
2682
+
2683
+ assert.strictEqual(result.length, 0)
2684
+ }))
2685
+
2686
+ it.effect("propagates errors from left stream", () =>
2687
+ Effect.gen(function*() {
2688
+ const stream1 = Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom")))
2689
+ const stream2 = Stream.make("a", "b", "c")
2690
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2691
+
2692
+ assertExitFailure(result, Cause.fail("boom"))
2693
+ }))
2694
+
2695
+ it.effect("propagates errors from right stream", () =>
2696
+ Effect.gen(function*() {
2697
+ const stream1 = Stream.make(1, 2, 3)
2698
+ const stream2 = Stream.make("a", "b").pipe(Stream.concat(Stream.fail("ouch")))
2699
+ const result = yield* Stream.zip(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2700
+
2701
+ assertExitFailure(result, Cause.fail("ouch"))
2702
+ }))
2703
+
2704
+ it.effect("works with pipe syntax", () =>
2705
+ Effect.gen(function*() {
2706
+ const stream1 = Stream.make(1, 2, 3)
2707
+ const stream2 = Stream.make("a", "b", "c")
2708
+ const result = yield* stream1.pipe(Stream.zip(stream2), Stream.runCollect)
2709
+
2710
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2711
+ }))
2712
+ })
2713
+
2714
+ describe("zipLeft", () => {
2715
+ it.effect("keeps only left values", () =>
2716
+ Effect.gen(function*() {
2717
+ const stream1 = Stream.make(1, 2, 3)
2718
+ const stream2 = Stream.make("a", "b", "c")
2719
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2720
+
2721
+ assert.deepStrictEqual(result, [1, 2, 3])
2722
+ }))
2723
+
2724
+ it.effect("terminates when left stream ends first", () =>
2725
+ Effect.gen(function*() {
2726
+ const stream1 = Stream.make(1, 2)
2727
+ const stream2 = Stream.make("a", "b", "c", "d")
2728
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2729
+
2730
+ assert.deepStrictEqual(result, [1, 2])
2731
+ }))
2732
+
2733
+ it.effect("terminates when right stream ends first", () =>
2734
+ Effect.gen(function*() {
2735
+ const stream1 = Stream.make(1, 2, 3, 4)
2736
+ const stream2 = Stream.make("a", "b")
2737
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2738
+
2739
+ assert.deepStrictEqual(result, [1, 2])
2740
+ }))
2741
+
2742
+ it.effect("handles empty left stream", () =>
2743
+ Effect.gen(function*() {
2744
+ const stream1 = Stream.empty
2745
+ const stream2 = Stream.make("a", "b", "c")
2746
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2747
+
2748
+ assert.strictEqual(result.length, 0)
2749
+ }))
2750
+
2751
+ it.effect("handles empty right stream", () =>
2752
+ Effect.gen(function*() {
2753
+ const stream1 = Stream.make(1, 2, 3)
2754
+ const stream2 = Stream.empty
2755
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2756
+
2757
+ assert.strictEqual(result.length, 0)
2758
+ }))
2759
+
2760
+ it.effect("propagates errors from left stream", () =>
2761
+ Effect.gen(function*() {
2762
+ const stream1 = Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom")))
2763
+ const stream2 = Stream.make("a", "b", "c")
2764
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2765
+
2766
+ assertExitFailure(result, Cause.fail("boom"))
2767
+ }))
2768
+
2769
+ it.effect("propagates errors from right stream", () =>
2770
+ Effect.gen(function*() {
2771
+ const stream1 = Stream.make(1, 2, 3)
2772
+ const stream2 = Stream.make("a", "b").pipe(Stream.concat(Stream.fail("ouch")))
2773
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2774
+
2775
+ assertExitFailure(result, Cause.fail("ouch"))
2776
+ }))
2777
+
2778
+ it.effect("works with pipe syntax", () =>
2779
+ Effect.gen(function*() {
2780
+ const stream1 = Stream.make(1, 2, 3)
2781
+ const stream2 = Stream.make("a", "b", "c")
2782
+ const result = yield* stream1.pipe(Stream.zipLeft(stream2), Stream.runCollect)
2783
+
2784
+ assert.deepStrictEqual(result, [1, 2, 3])
2785
+ }))
2786
+
2787
+ it.effect("consumes right stream elements", () =>
2788
+ Effect.gen(function*() {
2789
+ let rightPulled = 0
2790
+ const stream1 = Stream.make(1, 2, 3)
2791
+ const stream2 = Stream.make("a", "b", "c").pipe(
2792
+ Stream.tap(() =>
2793
+ Effect.sync(() => {
2794
+ rightPulled++
2795
+ })
2796
+ )
2797
+ )
2798
+ const result = yield* Stream.zipLeft(stream1, stream2).pipe(Stream.runCollect)
2799
+
2800
+ assert.deepStrictEqual(result, [1, 2, 3])
2801
+ assert.strictEqual(rightPulled, 3)
2802
+ }))
2803
+ })
2804
+
2805
+ describe("zipRight", () => {
2806
+ it.effect("keeps only right values", () =>
2807
+ Effect.gen(function*() {
2808
+ const stream1 = Stream.make(1, 2, 3)
2809
+ const stream2 = Stream.make("a", "b", "c")
2810
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2811
+
2812
+ assert.deepStrictEqual(result, ["a", "b", "c"])
2813
+ }))
2814
+
2815
+ it.effect("terminates when left stream ends first", () =>
2816
+ Effect.gen(function*() {
2817
+ const stream1 = Stream.make(1, 2)
2818
+ const stream2 = Stream.make("a", "b", "c", "d")
2819
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2820
+
2821
+ assert.deepStrictEqual(result, ["a", "b"])
2822
+ }))
2823
+
2824
+ it.effect("terminates when right stream ends first", () =>
2825
+ Effect.gen(function*() {
2826
+ const stream1 = Stream.make(1, 2, 3, 4)
2827
+ const stream2 = Stream.make("a", "b")
2828
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2829
+
2830
+ assert.deepStrictEqual(result, ["a", "b"])
2831
+ }))
2832
+
2833
+ it.effect("handles empty left stream", () =>
2834
+ Effect.gen(function*() {
2835
+ const stream1 = Stream.empty
2836
+ const stream2 = Stream.make("a", "b", "c")
2837
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2838
+
2839
+ assert.strictEqual(result.length, 0)
2840
+ }))
2841
+
2842
+ it.effect("handles empty right stream", () =>
2843
+ Effect.gen(function*() {
2844
+ const stream1 = Stream.make(1, 2, 3)
2845
+ const stream2 = Stream.empty
2846
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2847
+
2848
+ assert.strictEqual(result.length, 0)
2849
+ }))
2850
+
2851
+ it.effect("propagates errors from left stream", () =>
2852
+ Effect.gen(function*() {
2853
+ const stream1 = Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom")))
2854
+ const stream2 = Stream.make("a", "b", "c")
2855
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2856
+
2857
+ assertExitFailure(result, Cause.fail("boom"))
2858
+ }))
2859
+
2860
+ it.effect("propagates errors from right stream", () =>
2861
+ Effect.gen(function*() {
2862
+ const stream1 = Stream.make(1, 2, 3)
2863
+ const stream2 = Stream.make("a", "b").pipe(Stream.concat(Stream.fail("ouch")))
2864
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2865
+
2866
+ assertExitFailure(result, Cause.fail("ouch"))
2867
+ }))
2868
+
2869
+ it.effect("works with pipe syntax", () =>
2870
+ Effect.gen(function*() {
2871
+ const stream1 = Stream.make(1, 2, 3)
2872
+ const stream2 = Stream.make("a", "b", "c")
2873
+ const result = yield* stream1.pipe(Stream.zipRight(stream2), Stream.runCollect)
2874
+
2875
+ assert.deepStrictEqual(result, ["a", "b", "c"])
2876
+ }))
2877
+
2878
+ it.effect("consumes left stream elements", () =>
2879
+ Effect.gen(function*() {
2880
+ let leftPulled = 0
2881
+ const stream1 = Stream.make(1, 2, 3).pipe(
2882
+ Stream.tap(() =>
2883
+ Effect.sync(() => {
2884
+ leftPulled++
2885
+ })
2886
+ )
2887
+ )
2888
+ const stream2 = Stream.make("a", "b", "c")
2889
+ const result = yield* Stream.zipRight(stream1, stream2).pipe(Stream.runCollect)
2890
+
2891
+ assert.deepStrictEqual(result, ["a", "b", "c"])
2892
+ assert.strictEqual(leftPulled, 3)
2893
+ }))
2894
+ })
2895
+
2896
+ describe("zipFlatten", () => {
2897
+ it.effect("flattens tuples when zipping", () =>
2898
+ Effect.gen(function*() {
2899
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const, [3, "c"] as const)
2900
+ const stream2 = Stream.make("x", "y", "z")
2901
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2902
+
2903
+ assert.deepStrictEqual(result, [[1, "a", "x"], [2, "b", "y"], [3, "c", "z"]])
2904
+ }))
2905
+
2906
+ it.effect("works with single element tuples", () =>
2907
+ Effect.gen(function*() {
2908
+ const stream1 = Stream.make([1] as const, [2] as const, [3] as const)
2909
+ const stream2 = Stream.make("a", "b", "c")
2910
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2911
+
2912
+ assert.deepStrictEqual(result, [[1, "a"], [2, "b"], [3, "c"]])
2913
+ }))
2914
+
2915
+ it.effect("works with larger tuples", () =>
2916
+ Effect.gen(function*() {
2917
+ const stream1 = Stream.make([1, 2, 3] as const, [4, 5, 6] as const)
2918
+ const stream2 = Stream.make("a", "b")
2919
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2920
+
2921
+ assert.deepStrictEqual(result, [[1, 2, 3, "a"], [4, 5, 6, "b"]])
2922
+ }))
2923
+
2924
+ it.effect("terminates when left stream ends first", () =>
2925
+ Effect.gen(function*() {
2926
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const)
2927
+ const stream2 = Stream.make("x", "y", "z", "w")
2928
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2929
+
2930
+ assert.deepStrictEqual(result, [[1, "a", "x"], [2, "b", "y"]])
2931
+ }))
2932
+
2933
+ it.effect("terminates when right stream ends first", () =>
2934
+ Effect.gen(function*() {
2935
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const, [3, "c"] as const, [4, "d"] as const)
2936
+ const stream2 = Stream.make("x", "y")
2937
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2938
+
2939
+ assert.deepStrictEqual(result, [[1, "a", "x"], [2, "b", "y"]])
2940
+ }))
2941
+
2942
+ it.effect("handles empty left stream", () =>
2943
+ Effect.gen(function*() {
2944
+ const stream1 = Stream.empty
2945
+ const stream2 = Stream.make("a", "b", "c")
2946
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2947
+
2948
+ assert.strictEqual(result.length, 0)
2949
+ }))
2950
+
2951
+ it.effect("handles empty right stream", () =>
2952
+ Effect.gen(function*() {
2953
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const)
2954
+ const stream2 = Stream.empty
2955
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect)
2956
+
2957
+ assert.strictEqual(result.length, 0)
2958
+ }))
2959
+
2960
+ it.effect("propagates errors from left stream", () =>
2961
+ Effect.gen(function*() {
2962
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const).pipe(Stream.concat(Stream.fail("boom")))
2963
+ const stream2 = Stream.make("x", "y", "z")
2964
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2965
+
2966
+ assertExitFailure(result, Cause.fail("boom"))
2967
+ }))
2968
+
2969
+ it.effect("propagates errors from right stream", () =>
2970
+ Effect.gen(function*() {
2971
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const, [3, "c"] as const)
2972
+ const stream2 = Stream.make("x", "y").pipe(Stream.concat(Stream.fail("ouch")))
2973
+ const result = yield* Stream.zipFlatten(stream1, stream2).pipe(Stream.runCollect, Effect.exit)
2974
+
2975
+ assertExitFailure(result, Cause.fail("ouch"))
2976
+ }))
2977
+
2978
+ it.effect("works with pipe syntax", () =>
2979
+ Effect.gen(function*() {
2980
+ const stream1 = Stream.make([1, "a"] as const, [2, "b"] as const, [3, "c"] as const)
2981
+ const stream2 = Stream.make("x", "y", "z")
2982
+ const result = yield* stream1.pipe(Stream.zipFlatten(stream2), Stream.runCollect)
2983
+
2984
+ assert.deepStrictEqual(result, [[1, "a", "x"], [2, "b", "y"], [3, "c", "z"]])
2985
+ }))
2986
+ })
2987
+
2988
+ describe("zipWithIndex", () => {
2989
+ it.effect("zips stream with indices starting at 0", () =>
2990
+ Effect.gen(function*() {
2991
+ const stream = Stream.make("a", "b", "c", "d")
2992
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
2993
+
2994
+ assert.deepStrictEqual(result, [["a", 0], ["b", 1], ["c", 2], ["d", 3]])
2995
+ }))
2996
+
2997
+ it.effect("handles empty stream", () =>
2998
+ Effect.gen(function*() {
2999
+ const stream = Stream.empty
3000
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
3001
+
3002
+ assert.strictEqual(result.length, 0)
3003
+ }))
3004
+
3005
+ it.effect("handles single element stream", () =>
3006
+ Effect.gen(function*() {
3007
+ const stream = Stream.make("a")
3008
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
3009
+
3010
+ assert.deepStrictEqual(result, [["a", 0]])
3011
+ }))
3012
+
3013
+ it.effect("preserves order", () =>
3014
+ Effect.gen(function*() {
3015
+ const stream = Stream.make(5, 4, 3, 2, 1)
3016
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
3017
+
3018
+ assert.deepStrictEqual(result, [[5, 0], [4, 1], [3, 2], [2, 3], [1, 4]])
3019
+ }))
3020
+
3021
+ it.effect("works with numbers", () =>
3022
+ Effect.gen(function*() {
3023
+ const stream = Stream.make(10, 20, 30)
3024
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
3025
+
3026
+ assert.deepStrictEqual(result, [[10, 0], [20, 1], [30, 2]])
3027
+ }))
3028
+
3029
+ it.effect("propagates errors", () =>
3030
+ Effect.gen(function*() {
3031
+ const stream = Stream.make(1, 2, 3).pipe(Stream.concat(Stream.fail("boom")))
3032
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect, Effect.exit)
3033
+
3034
+ assertExitFailure(result, Cause.fail("boom"))
3035
+ }))
3036
+
3037
+ it.effect("works with pipe syntax", () =>
3038
+ Effect.gen(function*() {
3039
+ const stream = Stream.make("x", "y", "z")
3040
+ const result = yield* stream.pipe(Stream.zipWithIndex, Stream.runCollect)
3041
+
3042
+ assert.deepStrictEqual(result, [["x", 0], ["y", 1], ["z", 2]])
3043
+ }))
3044
+
3045
+ it.effect("index increments correctly for large streams", () =>
3046
+ Effect.gen(function*() {
3047
+ const stream = Stream.range(0, 99)
3048
+ const result = yield* Stream.zipWithIndex(stream).pipe(Stream.runCollect)
3049
+
3050
+ assert.strictEqual(result.length, 100)
3051
+ assert.deepStrictEqual(result[0], [0, 0])
3052
+ assert.deepStrictEqual(result[99], [99, 99])
3053
+ }))
3054
+ })
3055
+
3056
+ describe("zipLatest", () => {
3057
+ it.effect("combines streams with latest values", () =>
3058
+ Effect.gen(function*() {
3059
+ const result = yield* Stream.zipLatest(
3060
+ Stream.make(1, 2, 3),
3061
+ Stream.make("a", "b", "c", "d")
3062
+ ).pipe(Stream.runCollect)
3063
+
3064
+ // Both streams emit, latest values are paired
3065
+ assert.isTrue(result.length > 0)
3066
+ assert.isTrue(result.every((item) => Array.isArray(item) && item.length === 2))
3067
+ }))
3068
+
3069
+ it.effect("waits for both streams to emit before producing output", () =>
3070
+ Effect.gen(function*() {
3071
+ const queue1 = yield* Queue.unbounded<number>()
3072
+ const queue2 = yield* Queue.unbounded<string>()
3073
+
3074
+ const fiber = yield* Effect.forkScoped(
3075
+ Stream.zipLatest(
3076
+ Stream.fromQueue(queue1),
3077
+ Stream.fromQueue(queue2)
3078
+ ).pipe(Stream.take(3), Stream.runCollect)
3079
+ )
3080
+
3081
+ yield* Queue.offer(queue1, 1)
3082
+ yield* Queue.offer(queue2, "a")
3083
+ yield* Queue.offer(queue1, 2)
3084
+ yield* Queue.offer(queue2, "b")
3085
+ yield* Queue.offer(queue1, 3)
3086
+
3087
+ const result = yield* Fiber.join(fiber)
3088
+
3089
+ assert.isTrue(result.length > 0)
3090
+ }))
3091
+
3092
+ it.effect("propagates errors from left stream", () =>
3093
+ Effect.gen(function*() {
3094
+ const result = yield* Stream.zipLatest(
3095
+ Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom"))),
3096
+ Stream.make("a", "b", "c")
3097
+ ).pipe(Stream.runCollect, Effect.exit)
3098
+
3099
+ assertExitFailure(result, Cause.fail("boom"))
3100
+ }))
3101
+
3102
+ it.effect("propagates errors from right stream", () =>
3103
+ Effect.gen(function*() {
3104
+ const result = yield* Stream.zipLatest(
3105
+ Stream.make(1, 2, 3),
3106
+ Stream.make("a", "b").pipe(Stream.concat(Stream.fail("ouch")))
3107
+ ).pipe(Stream.runCollect, Effect.exit)
3108
+
3109
+ assertExitFailure(result, Cause.fail("ouch"))
3110
+ }))
3111
+
3112
+ it.effect("terminates when left stream ends", () =>
3113
+ Effect.gen(function*() {
3114
+ const result = yield* Stream.zipLatest(
3115
+ Stream.make(1, 2),
3116
+ Stream.make("a", "b", "c", "d", "e")
3117
+ ).pipe(Stream.runCollect)
3118
+
3119
+ // Should terminate when left stream (1, 2) ends
3120
+ assert.isTrue(result.length > 0)
3121
+ }))
3122
+
3123
+ it.effect("terminates when right stream ends", () =>
3124
+ Effect.gen(function*() {
3125
+ const result = yield* Stream.zipLatest(
3126
+ Stream.make(1, 2, 3, 4, 5),
3127
+ Stream.make("a", "b")
3128
+ ).pipe(Stream.runCollect)
3129
+
3130
+ // Should terminate when right stream ("a", "b") ends
3131
+ assert.isTrue(result.length > 0)
3132
+ }))
3133
+
3134
+ it.effect("works with pipe syntax", () =>
3135
+ Effect.gen(function*() {
3136
+ const result = yield* Stream.make(1, 2, 3).pipe(
3137
+ Stream.zipLatest(Stream.make("a", "b", "c")),
3138
+ Stream.runCollect
3139
+ )
3140
+
3141
+ assert.isTrue(result.length > 0)
3142
+ }))
3143
+
3144
+ it.effect("basic synchronous example", () =>
3145
+ Effect.gen(function*() {
3146
+ const result = yield* Stream.zipLatest(
3147
+ Stream.make(1, 2, 3),
3148
+ Stream.make("a", "b", "c")
3149
+ ).pipe(Stream.runCollect)
3150
+
3151
+ // Both streams emit synchronously, latest values are paired
3152
+ assert.isTrue(result.length > 0)
3153
+ assert.isTrue(result.every((item) => Array.isArray(item) && item.length === 2))
3154
+ }))
3155
+ })
3156
+
3157
+ describe("zipLatestWith", () => {
3158
+ it.effect("transforms combined values", () =>
3159
+ Effect.gen(function*() {
3160
+ const result = yield* Stream.zipLatestWith(
3161
+ Stream.make(1, 2, 3),
3162
+ Stream.make(10, 20, 30),
3163
+ (n, m) => n * m
3164
+ ).pipe(Stream.runCollect)
3165
+
3166
+ assert.isTrue(result.length > 0)
3167
+ assert.isTrue(result.every((item) => typeof item === "number"))
3168
+ }))
3169
+
3170
+ it.effect("combines with custom function", () =>
3171
+ Effect.gen(function*() {
3172
+ const result = yield* Stream.zipLatestWith(
3173
+ Stream.make(1, 2, 3),
3174
+ Stream.make("a", "b", "c"),
3175
+ (n, s) => `${n}-${s}`
3176
+ ).pipe(Stream.runCollect)
3177
+
3178
+ assert.isTrue(result.length > 0)
3179
+ assert.isTrue(result.every((item) => typeof item === "string" && item.includes("-")))
3180
+ }))
3181
+
3182
+ it.effect("propagates errors from left stream", () =>
3183
+ Effect.gen(function*() {
3184
+ const result = yield* Stream.zipLatestWith(
3185
+ Stream.make(1, 2).pipe(Stream.concat(Stream.fail("boom"))),
3186
+ Stream.make("a", "b", "c"),
3187
+ (n, s) => `${n}-${s}`
3188
+ ).pipe(Stream.runCollect, Effect.exit)
3189
+
3190
+ assertExitFailure(result, Cause.fail("boom"))
3191
+ }))
3192
+
3193
+ it.effect("propagates errors from right stream", () =>
3194
+ Effect.gen(function*() {
3195
+ const result = yield* Stream.zipLatestWith(
3196
+ Stream.make(1, 2, 3),
3197
+ Stream.make("a", "b").pipe(Stream.concat(Stream.fail("ouch"))),
3198
+ (n, s) => `${n}-${s}`
3199
+ ).pipe(Stream.runCollect, Effect.exit)
3200
+
3201
+ assertExitFailure(result, Cause.fail("ouch"))
3202
+ }))
3203
+
3204
+ it.effect("terminates when left stream ends", () =>
3205
+ Effect.gen(function*() {
3206
+ const result = yield* Stream.zipLatestWith(
3207
+ Stream.make(1, 2),
3208
+ Stream.make(10, 20, 30, 40),
3209
+ (n, m) => n + m
3210
+ ).pipe(Stream.runCollect)
3211
+
3212
+ assert.isTrue(result.length > 0)
3213
+ }))
3214
+
3215
+ it.effect("terminates when right stream ends", () =>
3216
+ Effect.gen(function*() {
3217
+ const result = yield* Stream.zipLatestWith(
3218
+ Stream.make(1, 2, 3, 4),
3219
+ Stream.make(10, 20),
3220
+ (n, m) => n + m
3221
+ ).pipe(Stream.runCollect)
3222
+
3223
+ assert.isTrue(result.length > 0)
3224
+ }))
3225
+
3226
+ it.effect("works with pipe syntax", () =>
3227
+ Effect.gen(function*() {
3228
+ const result = yield* Stream.make(1, 2, 3).pipe(
3229
+ Stream.zipLatestWith(
3230
+ Stream.make(10, 20, 30),
3231
+ (n, m) => n + m
3232
+ ),
3233
+ Stream.runCollect
3234
+ )
3235
+
3236
+ assert.isTrue(result.length > 0)
3237
+ }))
3238
+
3239
+ it.effect("basic synchronous example", () =>
3240
+ Effect.gen(function*() {
3241
+ const result = yield* Stream.zipLatestWith(
3242
+ Stream.make(1, 2, 3),
3243
+ Stream.make(10, 20, 30),
3244
+ (a, b) => a + b
3245
+ ).pipe(Stream.runCollect)
3246
+
3247
+ assert.isTrue(result.length > 0)
3248
+ assert.isTrue(result.every((item) => typeof item === "number"))
3249
+ }))
3250
+
3251
+ it.effect("string concatenation example", () =>
3252
+ Effect.gen(function*() {
3253
+ const result = yield* Stream.zipLatestWith(
3254
+ Stream.make("Alice", "Bob", "Charlie"),
3255
+ Stream.make("Smith", "Jones"),
3256
+ (first, last) => `${first} ${last}`
3257
+ ).pipe(Stream.runCollect)
3258
+
3259
+ assert.isTrue(result.length > 0)
3260
+ assert.isTrue(result.every((item) => typeof item === "string" && item.includes(" ")))
3261
+ }))
3262
+ })
3263
+ })
3264
+
3265
+ describe("tapSink", () => {
3266
+ it.effect("sink that is done after stream", () =>
3267
+ Effect.gen(function*() {
3268
+ const ref = yield* Ref.make(0)
3269
+ const sink = Sink.forEach((i: number) => Ref.update(ref, (n) => i + n))
3270
+ const result = yield* pipe(
3271
+ Stream.make(1, 1, 2, 3, 5, 8),
3272
+ Stream.tapSink(sink),
3273
+ Stream.runCollect
3274
+ )
3275
+ const sum = yield* (Ref.get(ref))
3276
+ strictEqual(sum, 20)
3277
+ deepStrictEqual(result, [1, 1, 2, 3, 5, 8])
3278
+ }))
3279
+
3280
+ it.effect("sink that is done before stream", () =>
3281
+ Effect.gen(function*() {
3282
+ const ref = yield* Ref.make(0)
3283
+ const sink = pipe(
3284
+ Sink.take<number>(3),
3285
+ Sink.map(Array.reduce(0, (x, y) => x + y)),
3286
+ Sink.mapEffect((i) => Ref.update(ref, (n) => n + i))
3287
+ )
3288
+ const result = yield* pipe(
3289
+ Stream.make(1, 1, 2, 3, 5, 8),
3290
+ Stream.rechunk(1),
3291
+ Stream.tapSink(sink),
3292
+ Stream.runCollect
3293
+ )
3294
+ const sum = yield* (Ref.get(ref))
3295
+ strictEqual(sum, 4)
3296
+ deepStrictEqual(result, [1, 1, 2, 3, 5, 8])
3297
+ }))
3298
+
3299
+ it.effect("sink that fails before stream", () =>
3300
+ Effect.gen(function*() {
3301
+ const sink = Sink.fail("error")
3302
+ const result = yield* pipe(
3303
+ Stream.make(1, 2, 3),
3304
+ Stream.tapSink(sink),
3305
+ Stream.runCollect,
3306
+ Effect.flip
3307
+ )
3308
+ strictEqual(result, "error")
3309
+ }))
3310
+
3311
+ it.effect("does not read ahead", () =>
3312
+ Effect.gen(function*() {
3313
+ const ref = yield* Ref.make(0)
3314
+ const sink = Sink.forEach((i: number) => Ref.update(ref, (n) => i + n))
3315
+ yield* pipe(
3316
+ Stream.make(1, 2, 3, 4, 5),
3317
+ Stream.rechunk(1),
3318
+ Stream.forever,
3319
+ Stream.tapSink(sink),
3320
+ Stream.take(3),
3321
+ Stream.runDrain
3322
+ )
3323
+ const result = yield* Ref.get(ref)
3324
+ strictEqual(result, 6)
3325
+ }))
3326
+ })
3327
+
3328
+ describe("dropping", () => {
3329
+ it.effect("drop - simple example", () =>
3330
+ Effect.gen(function*() {
3331
+ const n = 2
3332
+ const stream = Stream.make(1, 2, 3, 4, 5)
3333
+ const { result1, result2 } = yield* (Effect.all({
3334
+ result1: pipe(stream, Stream.drop(n), Stream.runCollect),
3335
+ result2: pipe(stream, Stream.runCollect, Effect.map(Array.drop(n)))
3336
+ }))
3337
+ deepStrictEqual(result1, result2)
3338
+ }))
3339
+
3340
+ it.effect("drop - does not swallow errors", () =>
3341
+ Effect.gen(function*() {
3342
+ const result = yield* pipe(
3343
+ Stream.fail("Ouch"),
3344
+ Stream.concat(Stream.make(1)),
3345
+ Stream.drop(1),
3346
+ Stream.runDrain,
3347
+ Effect.result
3348
+ )
3349
+ assertFailure(result, "Ouch")
3350
+ }))
3351
+
3352
+ it.effect("dropRight - simple example", () =>
3353
+ Effect.gen(function*() {
3354
+ const n = 2
3355
+ const stream = Stream.make(1, 2, 3, 4, 5)
3356
+ const { result1, result2 } = yield* (Effect.all({
3357
+ result1: pipe(stream, Stream.dropRight(n), Stream.runCollect),
3358
+ result2: pipe(stream, Stream.runCollect, Effect.map(Array.dropRight(n)))
3359
+ }))
3360
+ deepStrictEqual(result1, result2)
3361
+ }))
3362
+
3363
+ it.effect("dropRight - does not swallow errors", () =>
3364
+ Effect.gen(function*() {
3365
+ const result = yield* pipe(
3366
+ Stream.make(1),
3367
+ Stream.concat(Stream.fail("Ouch")),
3368
+ Stream.dropRight(1),
3369
+ Stream.runDrain,
3370
+ Effect.result
3371
+ )
3372
+ assertFailure(result, "Ouch")
3373
+ }))
3374
+
3375
+ it.effect("dropUntil", () =>
3376
+ Effect.gen(function*() {
3377
+ const stream = Stream.make(1, 2, 3, 4, 5)
3378
+ const f = (n: number) => n < 3
3379
+ const { result1, result2 } = yield* (Effect.all({
3380
+ result1: pipe(stream, Stream.dropUntil(f), Stream.runCollect),
3381
+ result2: pipe(
3382
+ Stream.runCollect(stream),
3383
+ Effect.map((chunk) => pipe(chunk, Array.dropWhile((n) => !f(n)), Array.drop(1)))
3384
+ )
3385
+ }))
3386
+ deepStrictEqual(result1, result2)
3387
+ }))
3388
+
3389
+ it.effect("dropWhile", () =>
3390
+ Effect.gen(function*() {
3391
+ const stream = Stream.make(1, 2, 3, 4, 5)
3392
+ const f = (n: number) => n < 3
3393
+ const { result1, result2 } = yield* (Effect.all({
3394
+ result1: pipe(stream, Stream.dropWhile(f), Stream.runCollect),
3395
+ result2: pipe(stream, Stream.runCollect, Effect.map(Array.dropWhile(f)))
3396
+ }))
3397
+ deepStrictEqual(result1, result2)
3398
+ }))
3399
+
3400
+ it.effect("dropWhileFilter", () =>
3401
+ Effect.gen(function*() {
3402
+ const result = yield* Stream.make(1, 2, 3, 4, 5).pipe(
3403
+ Stream.dropWhileFilter((n) => n < 3 ? Result.succeed(n) : Result.failVoid),
3404
+ Stream.runCollect
3405
+ )
3406
+ deepStrictEqual(result, [3, 4, 5])
3407
+ }))
3408
+
3409
+ it.effect("dropWhile - short circuits", () =>
3410
+ Effect.gen(function*() {
3411
+ const result = yield* pipe(
3412
+ Stream.make(1),
3413
+ Stream.concat(Stream.fail("Ouch")),
3414
+ Stream.take(1),
3415
+ Stream.dropWhile(constTrue),
3416
+ Stream.runDrain,
3417
+ Effect.result
3418
+ )
3419
+ assertSuccess(result, void 0)
3420
+ }))
3421
+ })
3422
+
3423
+ describe("haltWhen", () => {
3424
+ it.effect("halts after the current element", () =>
3425
+ Effect.gen(function*() {
3426
+ const ref = yield* Ref.make(false)
3427
+ const latch = yield* Deferred.make<void>()
3428
+ const halt = yield* Deferred.make<void>()
3429
+ yield* pipe(
3430
+ Deferred.await(latch),
3431
+ Effect.onInterrupt(() => Ref.set(ref, true)),
3432
+ Stream.fromEffect,
3433
+ Stream.haltWhen(Deferred.await(halt)),
3434
+ Stream.runDrain,
3435
+ Effect.forkChild
3436
+ )
3437
+ yield* Deferred.succeed(halt, void 0)
3438
+ yield* Deferred.succeed(latch, void 0)
3439
+ const result = yield* Ref.get(ref)
3440
+ assert.strictEqual(result, false)
3441
+ }))
3442
+
3443
+ it.effect("propagates errors", () =>
3444
+ Effect.gen(function*() {
3445
+ const halt = yield* Deferred.make<void, string>()
3446
+ yield* Deferred.fail(halt, "fail")
3447
+ const result = yield* pipe(
3448
+ Stream.make(0),
3449
+ Stream.forever,
3450
+ Stream.haltWhen(Deferred.await(halt)),
3451
+ Stream.runDrain,
3452
+ Effect.flip
3453
+ )
3454
+ assert.strictEqual(result, "fail")
3455
+ }))
3456
+ })
3457
+
3458
+ describe("intersperse", () => {
3459
+ it.effect("intersperse - several values", () =>
3460
+ Effect.gen(function*() {
3461
+ const result = yield* pipe(
3462
+ Stream.make(1, 2, 3, 4),
3463
+ Stream.map(String),
3464
+ Stream.intersperse("."),
3465
+ Stream.runCollect
3466
+ )
3467
+ deepStrictEqual(result, ["1", ".", "2", ".", "3", ".", "4"])
3468
+ }))
3469
+
3470
+ it.effect("intersperseAffixes - several values", () =>
3471
+ Effect.gen(function*() {
3472
+ const result = yield* pipe(
3473
+ Stream.make(1, 2, 3, 4),
3474
+ Stream.map(String),
3475
+ Stream.intersperseAffixes({ start: "[", middle: ".", end: "]" }),
3476
+ Stream.runCollect
3477
+ )
3478
+ deepStrictEqual(result, ["[", "1", ".", "2", ".", "3", ".", "4", "]"])
3479
+ }))
3480
+
3481
+ it.effect("intersperse - single value", () =>
3482
+ Effect.gen(function*() {
3483
+ const result = yield* pipe(
3484
+ Stream.make(1),
3485
+ Stream.map(String),
3486
+ Stream.intersperse("."),
3487
+ Stream.runCollect
3488
+ )
3489
+ deepStrictEqual(result, ["1"])
3490
+ }))
3491
+
3492
+ it.effect("intersperseAffixes - single value", () =>
3493
+ Effect.gen(function*() {
3494
+ const result = yield* pipe(
3495
+ Stream.make(1),
3496
+ Stream.map(String),
3497
+ Stream.intersperseAffixes({ start: "[", middle: ".", end: "]" }),
3498
+ Stream.runCollect
3499
+ )
3500
+ deepStrictEqual(result, ["[", "1", "]"])
3501
+ }))
3502
+
3503
+ it.effect("intersperse - several from repeat effect (ZIO #3729)", () =>
3504
+ Effect.gen(function*() {
3505
+ const result = yield* pipe(
3506
+ Stream.fromEffectRepeat(Effect.succeed(42)),
3507
+ Stream.map(String),
3508
+ Stream.take(4),
3509
+ Stream.intersperse("."),
3510
+ Stream.runCollect
3511
+ )
3512
+ deepStrictEqual(result, ["42", ".", "42", ".", "42", ".", "42"])
3513
+ }))
3514
+
3515
+ it.effect("intersperse - several from repeat effect chunk single element (ZIO #3729)", () =>
3516
+ Effect.gen(function*() {
3517
+ const result = yield* pipe(
3518
+ Stream.fromIterableEffectRepeat(Effect.succeed(Array.of(42))),
3519
+ Stream.map(String),
3520
+ Stream.intersperse("."),
3521
+ Stream.take(4),
3522
+ Stream.runCollect
3523
+ )
3524
+ deepStrictEqual(result, ["42", ".", "42", "."])
3525
+ }))
3526
+ })
3527
+
3528
+ describe("interleave", () => {
3529
+ it.effect("interleave", () =>
3530
+ Effect.gen(function*() {
3531
+ const stream1 = Stream.make(2, 3)
3532
+ const stream2 = Stream.make(5, 6, 7)
3533
+ const result = yield* pipe(
3534
+ stream1,
3535
+ Stream.interleave(stream2),
3536
+ Stream.runCollect
3537
+ )
3538
+ deepStrictEqual(result, [2, 5, 3, 6, 7])
3539
+ }))
3540
+
3541
+ it.effect("interleaveWith", () =>
3542
+ Effect.gen(function*() {
3543
+ const interleave = (
3544
+ bools: ReadonlyArray<boolean>,
3545
+ numbers1: ReadonlyArray<number>,
3546
+ numbers2: ReadonlyArray<number>
3547
+ ): ReadonlyArray<number> =>
3548
+ pipe(
3549
+ Array.head(bools),
3550
+ Option.map((head) => {
3551
+ if (head) {
3552
+ if (Array.isReadonlyArrayNonEmpty(numbers1)) {
3553
+ const head = pipe(numbers1, Array.getUnsafe(0))
3554
+ const tail = pipe(numbers1, Array.drop(1))
3555
+ return pipe(
3556
+ interleave(pipe(bools, Array.drop(1)), tail, numbers2),
3557
+ Array.prepend(head)
3558
+ )
3559
+ }
3560
+ if (Array.isReadonlyArrayNonEmpty(numbers2)) {
3561
+ return interleave(pipe(bools, Array.drop(1)), Array.empty<number>(), numbers2)
3562
+ }
3563
+ return Array.empty<number>()
3564
+ }
3565
+ if (Array.isReadonlyArrayNonEmpty(numbers2)) {
3566
+ const head = pipe(numbers2, Array.getUnsafe(0))
3567
+ const tail = pipe(numbers2, Array.drop(1))
3568
+ return pipe(
3569
+ interleave(pipe(bools, Array.drop(1)), numbers1, tail),
3570
+ Array.prepend(head)
3571
+ )
3572
+ }
3573
+ if (Array.isReadonlyArrayNonEmpty(numbers1)) {
3574
+ return interleave(pipe(bools, Array.drop(1)), numbers1, Array.empty<number>())
3575
+ }
3576
+ return Array.empty<number>()
3577
+ }),
3578
+ Option.getOrElse(() => Array.empty<number>())
3579
+ )
3580
+ const boolStream = Stream.make(true, true, false, true, false)
3581
+ const stream1 = Stream.make(1, 2, 3, 4, 5)
3582
+ const stream2 = Stream.make(4, 5, 6, 7, 8)
3583
+ const interleavedStream = yield* pipe(
3584
+ stream1,
3585
+ Stream.interleaveWith(stream2, boolStream),
3586
+ Stream.runCollect
3587
+ )
3588
+ const bools = yield* (Stream.runCollect(boolStream))
3589
+ const numbers1 = yield* (Stream.runCollect(stream1))
3590
+ const numbers2 = yield* (Stream.runCollect(stream2))
3591
+ const interleavedChunks = interleave(bools, numbers1, numbers2)
3592
+ deepStrictEqual(interleavedStream, interleavedChunks)
3593
+ }))
3594
+ })
3595
+
3596
+ describe("merge", () => {
3597
+ it.effect("data-first with options", () =>
3598
+ Effect.gen(function*() {
3599
+ const result = yield* Stream.runCollect(
3600
+ Stream.merge(Stream.make(1), Stream.never, { haltStrategy: "left" })
3601
+ )
3602
+ deepStrictEqual(result, [1])
3603
+ }))
3604
+
3605
+ it.effect("data-last with options", () =>
3606
+ Effect.gen(function*() {
3607
+ const result = yield* pipe(
3608
+ Stream.make(1),
3609
+ Stream.merge(Stream.never, { haltStrategy: "left" }),
3610
+ Stream.runCollect
3611
+ )
3612
+ deepStrictEqual(result, [1])
3613
+ }))
3614
+ })
3615
+
3616
+ describe("partition", () => {
3617
+ it.effect("values", () =>
3618
+ Effect.gen(function*() {
3619
+ const { result1, result2 } = yield* pipe(
3620
+ Stream.range(0, 5),
3621
+ Stream.partition((n) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n)),
3622
+ Effect.flatMap(([odds, evens]) =>
3623
+ Effect.all({
3624
+ result1: Stream.runCollect(evens),
3625
+ result2: Stream.runCollect(odds)
3626
+ })
3627
+ ),
3628
+ Effect.scoped
3629
+ )
3630
+ deepStrictEqual(result1, [0, 2, 4])
3631
+ deepStrictEqual(result2, [1, 3, 5])
3632
+ }))
3633
+
3634
+ it.effect("errors", () =>
3635
+ Effect.gen(function*() {
3636
+ const { result1, result2 } = yield* pipe(
3637
+ Stream.make(0),
3638
+ Stream.concat(Stream.fail("boom")),
3639
+ Stream.partition((n) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n)),
3640
+ Effect.flatMap(([odds, evens]) =>
3641
+ Effect.all({
3642
+ result1: Effect.flip(Stream.runCollect(evens)),
3643
+ result2: Effect.flip(Stream.runCollect(odds))
3644
+ })
3645
+ ),
3646
+ Effect.scoped
3647
+ )
3648
+ assert.strictEqual(result1, "boom")
3649
+ assert.strictEqual(result2, "boom")
3650
+ }))
3651
+
3652
+ it.effect("backpressure", () =>
3653
+ Effect.gen(function*() {
3654
+ const { result1, result2, result3 } = yield* pipe(
3655
+ Stream.range(0, 5),
3656
+ Stream.partition((n) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n), { bufferSize: 1 }),
3657
+ Effect.flatMap(([odds, evens]) =>
3658
+ Effect.gen(function*() {
3659
+ const ref = yield* Ref.make(Array.empty<number>())
3660
+ const latch = yield* Deferred.make<void>()
3661
+ const fiber = yield* pipe(
3662
+ evens,
3663
+ Stream.tap((n) =>
3664
+ pipe(
3665
+ Ref.update(ref, Array.prepend(n)),
3666
+ Effect.andThen(
3667
+ pipe(
3668
+ Deferred.succeed(latch, void 0),
3669
+ Effect.when(Effect.sync(() => n === 2))
3670
+ )
3671
+ )
3672
+ )
3673
+ ),
3674
+ Stream.runDrain,
3675
+ Effect.forkChild
3676
+ )
3677
+ yield* Deferred.await(latch)
3678
+ const result1 = yield* Ref.get(ref)
3679
+ const result2 = yield* Stream.runCollect(odds)
3680
+ yield* Fiber.await(fiber)
3681
+ const result3 = yield* Ref.get(ref)
3682
+ return { result1, result2, result3 }
3683
+ })
3684
+ ),
3685
+ Effect.scoped
3686
+ )
3687
+ deepStrictEqual(result1, [2, 0])
3688
+ deepStrictEqual(result2, [1, 3, 5])
3689
+ deepStrictEqual(result3, [4, 2, 0])
3690
+ }))
3691
+ })
3692
+
3693
+ describe("partition", () => {
3694
+ it.effect("partitionEffect - allows repeated runs without hanging", () =>
3695
+ Effect.gen(function*() {
3696
+ const stream = pipe(
3697
+ Stream.fromIterable(Array.empty<number>()),
3698
+ Stream.partitionEffect((n) => Effect.succeed(n % 2 === 0 ? Result.succeed(n) : Result.fail(n))),
3699
+ Effect.map(([odds, evens]) => pipe(evens, Stream.mergeResult(odds))),
3700
+ Effect.flatMap(Stream.runCollect),
3701
+ Effect.scoped
3702
+ )
3703
+ const result = yield* pipe(
3704
+ Effect.all(Array.makeBy(100, () => stream)),
3705
+ Effect.as(0)
3706
+ )
3707
+ strictEqual(result, 0)
3708
+ }))
3709
+
3710
+ it.effect("partitionEffect - values", () =>
3711
+ Effect.gen(function*() {
3712
+ const { result1, result2 } = yield* pipe(
3713
+ Stream.range(0, 5),
3714
+ Stream.partitionEffect((n) => Effect.succeed(n % 2 === 0 ? Result.succeed(n + 10) : Result.fail(`odd:${n}`))),
3715
+ Effect.flatMap(([passes, fails]) =>
3716
+ Effect.all({
3717
+ result1: Stream.runCollect(passes),
3718
+ result2: Stream.runCollect(fails)
3719
+ })
3720
+ ),
3721
+ Effect.scoped
3722
+ )
3723
+ deepStrictEqual(result1, [10, 12, 14])
3724
+ deepStrictEqual(result2, ["odd:1", "odd:3", "odd:5"])
3725
+ }))
3726
+
3727
+ it.effect("partitionQueue - values", () =>
3728
+ Effect.gen(function*() {
3729
+ const { result1, result2 } = yield* pipe(
3730
+ Stream.range(0, 5),
3731
+ Stream.partitionQueue((n) => n % 2 === 0 ? Result.succeed(n + 1) : Result.fail(`odd:${n}`)),
3732
+ Effect.flatMap(([passes, fails]) =>
3733
+ Effect.all({
3734
+ result1: Stream.runCollect(Stream.fromQueue(passes)),
3735
+ result2: Stream.runCollect(Stream.fromQueue(fails))
3736
+ })
3737
+ ),
3738
+ Effect.scoped
3739
+ )
3740
+ deepStrictEqual(result1, [1, 3, 5])
3741
+ deepStrictEqual(result2, ["odd:1", "odd:3", "odd:5"])
3742
+ }))
3743
+
3744
+ it.effect("partition - values", () =>
3745
+ Effect.gen(function*() {
3746
+ const { result1, result2 } = yield* pipe(
3747
+ Stream.range(0, 5),
3748
+ Stream.partition((n) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n)),
3749
+ Effect.flatMap(([odds, evens]) =>
3750
+ Effect.all({
3751
+ result1: Stream.runCollect(evens),
3752
+ result2: Stream.runCollect(odds)
3753
+ })
3754
+ ),
3755
+ Effect.scoped
3756
+ )
3757
+ deepStrictEqual(result1, [0, 2, 4])
3758
+ deepStrictEqual(result2, [1, 3, 5])
3759
+ }))
3760
+
3761
+ it.effect("partition - errors", () =>
3762
+ Effect.gen(function*() {
3763
+ const { result1, result2 } = yield* pipe(
3764
+ Stream.make(0),
3765
+ Stream.concat(Stream.fail("boom")),
3766
+ Stream.partition((n) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n)),
3767
+ Effect.flatMap(([odds, evens]) =>
3768
+ Effect.all({
3769
+ result1: Effect.flip(Stream.runCollect(evens)),
3770
+ result2: Effect.flip(Stream.runCollect(odds))
3771
+ })
3772
+ ),
3773
+ Effect.scoped
3774
+ )
3775
+ assert.strictEqual(result1, "boom")
3776
+ assert.strictEqual(result2, "boom")
3777
+ }))
3778
+
3779
+ it.effect("partition - backpressure", () =>
3780
+ Effect.gen(function*() {
3781
+ const { result1, result2, result3 } = yield* pipe(
3782
+ Stream.range(0, 5),
3783
+ Stream.partition((n) => (n % 2 === 0 ? Result.succeed(n) : Result.fail(n)), { bufferSize: 1 }),
3784
+ Effect.flatMap(([odds, evens]) =>
3785
+ Effect.gen(function*() {
3786
+ const ref = yield* Ref.make(Array.empty<number>())
3787
+ const latch = yield* (Deferred.make<void>())
3788
+ const fiber = yield* pipe(
3789
+ evens,
3790
+ Stream.tap((n) =>
3791
+ pipe(
3792
+ Ref.update(ref, Array.prepend(n)),
3793
+ Effect.andThen(
3794
+ pipe(
3795
+ Deferred.succeed(latch, void 0),
3796
+ Effect.when(Effect.sync(() => n === 2))
3797
+ )
3798
+ )
3799
+ )
3800
+ ),
3801
+ Stream.runDrain,
3802
+ Effect.forkChild
3803
+ )
3804
+ yield* (Deferred.await(latch))
3805
+ const result1 = yield* (Ref.get(ref))
3806
+ const result2 = yield* (Stream.runCollect(odds))
3807
+ yield* (Fiber.await(fiber))
3808
+ const result3 = yield* (Ref.get(ref))
3809
+ return { result1, result2, result3 }
3810
+ })
3811
+ ),
3812
+ Effect.scoped
3813
+ )
3814
+ deepStrictEqual(result1, [2, 0])
3815
+ deepStrictEqual(result2, [1, 3, 5])
3816
+ deepStrictEqual(result3, [4, 2, 0])
3817
+ }))
3818
+
3819
+ it.effect("partition with Filter", () =>
3820
+ Effect.gen(function*() {
3821
+ const { evens, odds } = yield* pipe(
3822
+ Stream.range(0, 5),
3823
+ Stream.partition((n: number) => n % 2 === 0 ? Result.succeed(n) : Result.fail(n)),
3824
+ Effect.flatMap(([fail, pass]) =>
3825
+ Effect.all({
3826
+ evens: Stream.runCollect(pass),
3827
+ odds: Stream.runCollect(fail)
3828
+ })
3829
+ ),
3830
+ Effect.scoped
3831
+ )
3832
+ deepStrictEqual(evens, [0, 2, 4])
3833
+ deepStrictEqual(odds, [1, 3, 5])
3834
+ }))
3835
+ })
3836
+
3837
+ describe("peel", () => {
3838
+ it.effect("peel", () =>
3839
+ Effect.gen(function*() {
3840
+ const sink = Sink.take<number>(3)
3841
+ const [peeled, rest] = yield* pipe(
3842
+ Stream.fromArrays(Array.range(1, 3), Array.range(4, 6)),
3843
+ Stream.peel(sink),
3844
+ Effect.flatMap(([peeled, rest]) =>
3845
+ pipe(
3846
+ Stream.runCollect(rest),
3847
+ Effect.map((rest) => [peeled, rest])
3848
+ )
3849
+ ),
3850
+ Effect.scoped
3851
+ )
3852
+ deepStrictEqual(peeled, [1, 2, 3])
3853
+ deepStrictEqual(rest, [4, 5, 6])
3854
+ }))
3855
+
3856
+ it.effect("peel - propagates errors", () =>
3857
+ Effect.gen(function*() {
3858
+ const stream = Stream.fromEffectRepeat(Effect.fail("fail"))
3859
+ const sink = Sink.fold<ReadonlyArray<number>, number>(
3860
+ Array.empty,
3861
+ constTrue,
3862
+ (acc, n) => Effect.succeed(Array.append(acc, n))
3863
+ )
3864
+ const result = yield* pipe(
3865
+ stream,
3866
+ Stream.peel(sink),
3867
+ Effect.exit,
3868
+ Effect.scoped
3869
+ )
3870
+ deepStrictEqual(result, Exit.fail("fail"))
3871
+ }))
3872
+ })
3873
+
3874
+ describe("repeat", () => {
3875
+ it.effect("repeat", () =>
3876
+ Effect.gen(function*() {
3877
+ const result = yield* pipe(
3878
+ Stream.make(1),
3879
+ Stream.repeat(Schedule.recurs(4)),
3880
+ Stream.runCollect
3881
+ )
3882
+ deepStrictEqual(result, [1, 1, 1, 1, 1])
3883
+ }))
3884
+
3885
+ // it.effect("tick", () =>
3886
+ // Effect.gen(function*() {
3887
+ // const fiber = yield* pipe(
3888
+ // Stream.tick("10 millis"),
3889
+ // Stream.take(2),
3890
+ // Stream.runCollect,
3891
+ // Effect.fork
3892
+ // )
3893
+ // yield* (TestClock.adjust(Duration.millis(50)))
3894
+ // const result = yield* (Fiber.join(fiber))
3895
+ // deepStrictEqual(Array.from(result), [undefined, undefined])
3896
+ // }))
3897
+
3898
+ it.effect("repeat - short circuits", () =>
3899
+ Effect.gen(function*() {
3900
+ const ref = yield* Ref.make(Array.empty<number>())
3901
+ const fiber = yield* pipe(
3902
+ Stream.fromEffect(Ref.update(ref, Array.prepend(1))),
3903
+ Stream.repeat(Schedule.spaced(Duration.millis(10))),
3904
+ Stream.take(2),
3905
+ Stream.runDrain,
3906
+ Effect.forkChild
3907
+ )
3908
+ yield* TestClock.adjust(Duration.millis(50))
3909
+ yield* Fiber.join(fiber)
3910
+ const result = yield* Ref.get(ref)
3911
+ deepStrictEqual(result, [1, 1])
3912
+ }))
3913
+
3914
+ // it.effect("repeat - Schedule.CurrentIterationMetadata", () =>
3915
+ // Effect.gen(function*() {
3916
+ // const ref = yield* (Ref.make(Chunk.empty<undefined | Schedule.IterationMetadata>()))
3917
+ // const fiber = yield* pipe(
3918
+ // Stream.fromEffect(
3919
+ // Schedule.CurrentIterationMetadata.pipe(
3920
+ // Effect.flatMap((currentIterationMetadata) => Ref.update(ref, Chunk.append(currentIterationMetadata)))
3921
+ // )
3922
+ // ),
3923
+ // Stream.repeat(Schedule.exponential(Duration.millis(10))),
3924
+ // Stream.runDrain,
3925
+ // Effect.fork
3926
+ // )
3927
+ //
3928
+ // yield* (TestClock.adjust(Duration.millis(70)))
3929
+ // yield* (Fiber.interrupt(fiber))
3930
+ // const result = yield* (Ref.get(ref))
3931
+ // deepStrictEqual(Array.from(result), [
3932
+ // {
3933
+ // elapsed: Duration.zero,
3934
+ // elapsedSincePrevious: Duration.zero,
3935
+ // input: undefined,
3936
+ // output: undefined,
3937
+ // now: 0,
3938
+ // recurrence: 0,
3939
+ // start: 0
3940
+ // },
3941
+ // {
3942
+ // elapsed: Duration.zero,
3943
+ // elapsedSincePrevious: Duration.zero,
3944
+ // input: undefined,
3945
+ // output: Duration.millis(10),
3946
+ // now: 0,
3947
+ // recurrence: 1,
3948
+ // start: 0
3949
+ // },
3950
+ // {
3951
+ // elapsed: Duration.millis(10),
3952
+ // elapsedSincePrevious: Duration.millis(10),
3953
+ // input: undefined,
3954
+ // output: Duration.millis(20),
3955
+ // now: 10,
3956
+ // recurrence: 2,
3957
+ // start: 0
3958
+ // },
3959
+ // {
3960
+ // elapsed: Duration.millis(30),
3961
+ // elapsedSincePrevious: Duration.millis(20),
3962
+ // input: undefined,
3963
+ // output: Duration.millis(40),
3964
+ // now: 30,
3965
+ // recurrence: 3,
3966
+ // start: 0
3967
+ // }
3968
+ // ])
3969
+ // }))
3970
+
3971
+ it.effect("repeat - does not swallow errors on a repetition", () =>
3972
+ Effect.gen(function*() {
3973
+ const ref = yield* (Ref.make(0))
3974
+ const result = yield* pipe(
3975
+ Stream.fromEffect(pipe(
3976
+ Ref.getAndUpdate(ref, (n) => n + 1),
3977
+ Effect.flatMap((n) => n <= 2 ? Effect.succeed(n) : Effect.fail("boom"))
3978
+ )),
3979
+ Stream.repeat(Schedule.recurs(3)),
3980
+ Stream.runDrain,
3981
+ Effect.exit
3982
+ )
3983
+ deepStrictEqual(result, Exit.fail("boom"))
3984
+ }))
3985
+
3986
+ it.effect("repeatElements - simple", () =>
3987
+ Effect.gen(function*() {
3988
+ const result = yield* pipe(
3989
+ Stream.make("A", "B", "C"),
3990
+ Stream.repeatElements(Schedule.recurs(1)),
3991
+ Stream.runCollect
3992
+ )
3993
+ deepStrictEqual(result, ["A", "A", "B", "B", "C", "C"])
3994
+ }))
3995
+
3996
+ it.effect("repeatElements - short circuits in a schedule", () =>
3997
+ Effect.gen(function*() {
3998
+ const result = yield* pipe(
3999
+ Stream.make("A", "B", "C"),
4000
+ Stream.repeatElements(Schedule.recurs(1)),
4001
+ Stream.take(4),
4002
+ Stream.runCollect
4003
+ )
4004
+ deepStrictEqual(result, ["A", "A", "B", "B"])
4005
+ }))
4006
+
4007
+ it.effect("repeatElements - short circuits after schedule", () =>
4008
+ Effect.gen(function*() {
4009
+ const result = yield* pipe(
4010
+ Stream.make("A", "B", "C"),
4011
+ Stream.repeatElements(Schedule.recurs(1)),
4012
+ Stream.take(3),
4013
+ Stream.runCollect
4014
+ )
4015
+ deepStrictEqual(result, ["A", "A", "B"])
4016
+ }))
4017
+ })
4018
+
4019
+ describe("retry", () => {
4020
+ it.effect("retry - retries a failing stream", () =>
4021
+ Effect.gen(function*() {
4022
+ const ref = yield* Ref.make(0)
4023
+ const stream = pipe(
4024
+ Stream.fromEffect(Ref.getAndUpdate(ref, (n) => n + 1)),
4025
+ Stream.concat(Stream.fail(Option.none()))
4026
+ )
4027
+ const result = yield* pipe(
4028
+ stream,
4029
+ Stream.retry(Schedule.forever),
4030
+ Stream.take(2),
4031
+ Stream.runCollect
4032
+ )
4033
+ deepStrictEqual(Array.fromIterable(result), [0, 1])
4034
+ }))
4035
+
4036
+ it.effect("retry - cleans up resources before restarting the stream", () =>
4037
+ Effect.gen(function*() {
4038
+ const ref = yield* Ref.make(0)
4039
+ const stream = pipe(
4040
+ Effect.addFinalizer(() => Ref.getAndUpdate(ref, (n) => n + 1)),
4041
+ Effect.as(
4042
+ pipe(
4043
+ Stream.fromEffect(Ref.get(ref)),
4044
+ Stream.concat(Stream.fail(Option.none()))
4045
+ )
4046
+ ),
4047
+ Stream.unwrap
4048
+ )
4049
+ const result = yield* pipe(
4050
+ stream,
4051
+ Stream.retry(Schedule.forever),
4052
+ Stream.take(2),
4053
+ Stream.runCollect
4054
+ )
4055
+ deepStrictEqual(result, [0, 1])
4056
+ }))
4057
+
4058
+ it.effect("retry - retries a failing stream according to a schedule", () =>
4059
+ Effect.gen(function*() {
4060
+ const ref = yield* Ref.make(Array.empty<number>())
4061
+ const stream = pipe(
4062
+ Stream.fromEffect(
4063
+ pipe(
4064
+ Clock.currentTimeMillis,
4065
+ Effect.flatMap((n) => Ref.update(ref, Array.prepend(n)))
4066
+ )
4067
+ ),
4068
+ Stream.flatMap(() => Stream.fail(Option.none()))
4069
+ )
4070
+ const fiber = yield* pipe(
4071
+ stream,
4072
+ Stream.retry(Schedule.exponential(Duration.seconds(1))),
4073
+ Stream.take(3),
4074
+ Stream.runDrain,
4075
+ Effect.forkChild
4076
+ )
4077
+ yield* TestClock.adjust(Duration.seconds(1))
4078
+ yield* TestClock.adjust(Duration.seconds(2))
4079
+ yield* Fiber.interrupt(fiber)
4080
+ const result = yield* pipe(Ref.get(ref), Effect.map(Array.map((n) => new Date(n).getSeconds())))
4081
+ deepStrictEqual(Array.fromIterable(result), [3, 1, 0])
4082
+ }))
4083
+
4084
+ it.effect("retry - reset the schedule after a successful pull", () =>
4085
+ Effect.gen(function*() {
4086
+ const times = yield* Ref.make(Array.empty<number>())
4087
+ const ref = yield* Ref.make(0)
4088
+ const effect = pipe(
4089
+ Clock.currentTimeMillis,
4090
+ Effect.flatMap((time) =>
4091
+ pipe(
4092
+ Ref.update(times, Array.prepend(time / 1000)),
4093
+ Effect.andThen(Ref.updateAndGet(ref, (n) => n + 1))
4094
+ )
4095
+ )
4096
+ )
4097
+ const stream = pipe(
4098
+ Stream.fromEffect(effect),
4099
+ Stream.flatMap((attempt) =>
4100
+ attempt === 3 || attempt === 5 ?
4101
+ Stream.succeed(attempt) :
4102
+ Stream.fail(Option.none())
4103
+ ),
4104
+ Stream.forever
4105
+ )
4106
+ const fiber = yield* pipe(
4107
+ stream,
4108
+ Stream.retry(Schedule.exponential(Duration.seconds(1))),
4109
+ Stream.take(2),
4110
+ Stream.runDrain,
4111
+ Effect.forkChild
4112
+ )
4113
+ yield* TestClock.adjust(Duration.seconds(1))
4114
+ yield* TestClock.adjust(Duration.seconds(2))
4115
+ yield* TestClock.adjust(Duration.seconds(1))
4116
+ yield* Fiber.join(fiber)
4117
+ const result = yield* Ref.get(times)
4118
+ deepStrictEqual(result, [4, 3, 3, 1, 0])
4119
+ }))
4120
+
4121
+ it.effect("retry - Schedule.CurrentMetadata", () =>
4122
+ Effect.gen(function*() {
4123
+ const metadata = yield* Ref.make(Array.empty<undefined | Schedule.Metadata>())
4124
+ const fiber = yield* pipe(
4125
+ Stream.fail(1),
4126
+ Stream.tapError(Effect.fnUntraced(function*(_) {
4127
+ const currentMeta = yield* Schedule.CurrentMetadata
4128
+ yield* Ref.update(metadata, Array.append(currentMeta))
4129
+ })),
4130
+ Stream.retry(Schedule.exponential(Duration.seconds(1))),
4131
+ Stream.runDrain,
4132
+ Effect.forkChild({ startImmediately: true })
4133
+ )
4134
+ yield* TestClock.adjust(Duration.seconds(7))
4135
+ yield* Fiber.interrupt(fiber)
4136
+ const result = yield* Ref.get(metadata)
4137
+ deepStrictEqual(result, [
4138
+ {
4139
+ elapsed: 0,
4140
+ elapsedSincePrevious: 0,
4141
+ input: undefined,
4142
+ output: undefined,
4143
+ now: 0,
4144
+ attempt: 0,
4145
+ start: 0,
4146
+ duration: Duration.zero
4147
+ },
4148
+ {
4149
+ elapsed: 0,
4150
+ elapsedSincePrevious: 0,
4151
+ input: 1,
4152
+ output: Duration.millis(1000),
4153
+ now: 0,
4154
+ attempt: 1,
4155
+ start: 0,
4156
+ duration: Duration.millis(1000)
4157
+ },
4158
+ {
4159
+ elapsed: 1000,
4160
+ elapsedSincePrevious: 1000,
4161
+ input: 1,
4162
+ output: Duration.millis(2000),
4163
+ now: 1000,
4164
+ attempt: 2,
4165
+ start: 0,
4166
+ duration: Duration.millis(2000)
4167
+ },
4168
+ {
4169
+ elapsed: 3000,
4170
+ elapsedSincePrevious: 2000,
4171
+ input: 1,
4172
+ output: Duration.millis(4000),
4173
+ now: 3000,
4174
+ attempt: 3,
4175
+ start: 0,
4176
+ duration: Duration.millis(4000)
4177
+ }
4178
+ ])
4179
+ }))
4180
+ })
4181
+
4182
+ describe("schedule", () => {
4183
+ it.effect("schedule", () =>
4184
+ Effect.gen(function*() {
4185
+ const start = yield* Clock.currentTimeMillis
4186
+ const fiber = yield* pipe(
4187
+ Stream.range(1, 8),
4188
+ Stream.schedule(Schedule.fixed(Duration.millis(100))),
4189
+ Stream.mapEffect((n) =>
4190
+ pipe(
4191
+ Clock.currentTimeMillis,
4192
+ Effect.map((now) => [n, now - start] as const)
4193
+ )
4194
+ ),
4195
+ Stream.runCollect,
4196
+ Effect.forkChild
4197
+ )
4198
+ yield* TestClock.adjust(Duration.millis(800))
4199
+ const result = yield* Fiber.join(fiber)
4200
+ deepStrictEqual(result, [
4201
+ [1, 100],
4202
+ [2, 200],
4203
+ [3, 300],
4204
+ [4, 400],
4205
+ [5, 500],
4206
+ [6, 600],
4207
+ [7, 700],
4208
+ [8, 800]
4209
+ ])
4210
+ }))
4211
+ })
4212
+
4213
+ describe("sliding", () => {
4214
+ it.effect("sliding - returns a sliding window", () =>
4215
+ Effect.gen(function*() {
4216
+ const stream0 = Stream.fromArrays(
4217
+ Array.empty<number>(),
4218
+ Array.make(1),
4219
+ Array.empty<number>(),
4220
+ Array.make(2, 3, 4, 5)
4221
+ )
4222
+ const stream1 = pipe(
4223
+ Stream.empty,
4224
+ Stream.concat(Stream.make(1)),
4225
+ Stream.concat(Stream.empty),
4226
+ Stream.concat(Stream.make(2)),
4227
+ Stream.concat(Stream.make(3, 4, 5))
4228
+ )
4229
+ const stream2 = pipe(
4230
+ Stream.make(1),
4231
+ Stream.concat(Stream.empty),
4232
+ Stream.concat(Stream.make(2)),
4233
+ Stream.concat(Stream.empty),
4234
+ Stream.concat(Stream.make(3, 4, 5))
4235
+ )
4236
+ const stream3 = pipe(
4237
+ Stream.make(1),
4238
+ Stream.concat(Stream.make(2)),
4239
+ Stream.concat(Stream.make(3, 4, 5))
4240
+ )
4241
+ const result1 = yield* pipe(
4242
+ Stream.make(1, 2, 3, 4, 5),
4243
+ Stream.sliding(2),
4244
+ Stream.runCollect
4245
+ )
4246
+ const result2 = yield* pipe(
4247
+ stream0,
4248
+ Stream.sliding(2),
4249
+ Stream.runCollect
4250
+ )
4251
+ const result3 = yield* pipe(
4252
+ stream1,
4253
+ Stream.sliding(2),
4254
+ Stream.runCollect
4255
+ )
4256
+ const result4 = yield* pipe(
4257
+ stream2,
4258
+ Stream.sliding(2),
4259
+ Stream.runCollect
4260
+ )
4261
+ const result5 = yield* pipe(
4262
+ stream3,
4263
+ Stream.sliding(2),
4264
+ Stream.runCollect
4265
+ )
4266
+ const expected = [[1, 2], [2, 3], [3, 4], [4, 5]]
4267
+ deepStrictEqual(result1, expected as any)
4268
+ deepStrictEqual(result2, expected as any)
4269
+ deepStrictEqual(result3, expected as any)
4270
+ deepStrictEqual(result4, expected as any)
4271
+ deepStrictEqual(result5, expected as any)
4272
+ }))
4273
+
4274
+ it.effect("sliding - returns all elements if chunkSize is greater than the size of the stream", () =>
4275
+ Effect.gen(function*() {
4276
+ const result = yield* pipe(
4277
+ Stream.range(1, 5),
4278
+ Stream.sliding(6),
4279
+ Stream.runCollect
4280
+ )
4281
+ deepStrictEqual(result, [[1, 2, 3, 4, 5]])
4282
+ }))
4283
+
4284
+ it.effect("sliding - is mostly equivalent to ZStream#grouped when stepSize and chunkSize are equal", () =>
4285
+ Effect.gen(function*() {
4286
+ const stream = Stream.range(1, 5)
4287
+ const { result1, result2 } = yield* (Effect.all({
4288
+ result1: pipe(stream, Stream.slidingSize(3, 3), Stream.runCollect),
4289
+ result2: pipe(stream, Stream.grouped(3), Stream.runCollect)
4290
+ }))
4291
+ deepStrictEqual(result1, result2)
4292
+ }))
4293
+
4294
+ it.effect("sliding - fails if upstream produces an error", () =>
4295
+ Effect.gen(function*() {
4296
+ const result = yield* pipe(
4297
+ Stream.make(1, 2, 3),
4298
+ Stream.concat(Stream.fail("Ouch")),
4299
+ Stream.concat(Stream.make(4, 5)),
4300
+ Stream.sliding(2),
4301
+ Stream.runCollect,
4302
+ Effect.flip
4303
+ )
4304
+ assert.strictEqual(result, "Ouch")
4305
+ }))
4306
+
4307
+ it.effect("sliding - should return an empty chunk when the stream is empty", () =>
4308
+ Effect.gen(function*() {
4309
+ const result = yield* pipe(Stream.empty, Stream.sliding(2), Stream.runCollect)
4310
+ deepStrictEqual(result, [])
4311
+ }))
4312
+
4313
+ it.effect("sliding - emits elements properly when a failure occurs", () =>
4314
+ Effect.gen(function*() {
4315
+ const ref = yield* Ref.make(Array.empty<Array.NonEmptyReadonlyArray<number>>())
4316
+ const streamChunks = Stream.fromArrays(
4317
+ Array.range(1, 4),
4318
+ Array.range(5, 7),
4319
+ Array.of(8)
4320
+ )
4321
+ const stream = pipe(
4322
+ streamChunks,
4323
+ Stream.concat(Stream.fail("Ouch")),
4324
+ Stream.slidingSize(3, 3)
4325
+ )
4326
+ const either = yield* pipe(
4327
+ stream,
4328
+ Stream.mapEffect((chunk) => Ref.update(ref, Array.append(chunk))),
4329
+ Stream.runCollect,
4330
+ Effect.flip
4331
+ )
4332
+ const result = yield* (Ref.get(ref))
4333
+ assert.strictEqual(either, "Ouch")
4334
+ deepStrictEqual(result, [[1, 2, 3], [4, 5, 6], [7, 8]])
4335
+ }))
4336
+ })
4337
+
4338
+ describe("split", () => {
4339
+ it.effect("split - should split properly", () =>
4340
+ Effect.gen(function*() {
4341
+ const chunks = Array.make(
4342
+ Array.range(1, 2),
4343
+ Array.range(3, 4),
4344
+ Array.range(5, 6),
4345
+ Array.make(7, 8, 9),
4346
+ Array.of(10)
4347
+ )
4348
+ const { result1, result2 } = yield* (Effect.all({
4349
+ result1: pipe(
4350
+ Stream.range(0, 9),
4351
+ Stream.split((n) => n % 4 === 0),
4352
+ Stream.runCollect
4353
+ ),
4354
+ result2: pipe(
4355
+ Stream.fromArrays(...chunks),
4356
+ Stream.split((n) => n % 3 === 0),
4357
+ Stream.runCollect
4358
+ )
4359
+ }))
4360
+ deepStrictEqual(
4361
+ result1,
4362
+ [[1, 2, 3], [5, 6, 7], [9]]
4363
+ )
4364
+ deepStrictEqual(
4365
+ result2,
4366
+ [[1, 2], [4, 5], [7, 8], [10]]
4367
+ )
4368
+ }))
4369
+
4370
+ it.effect("split - is equivalent to identity when the predicate is not satisfied", () =>
4371
+ Effect.gen(function*() {
4372
+ const stream = Stream.range(1, 10)
4373
+ const { result1, result2 } = yield* (Effect.all({
4374
+ result1: pipe(stream, Stream.split((n) => n % 11 === 0), Stream.runCollect),
4375
+ result2: pipe(
4376
+ Stream.runCollect(stream),
4377
+ Effect.map((chunk) => pipe(Array.of(chunk), Array.filter(Array.isArrayNonEmpty)))
4378
+ )
4379
+ }))
4380
+ deepStrictEqual(result1, [Array.range(1, 10)])
4381
+ deepStrictEqual(result1, result2)
4382
+ }))
4383
+
4384
+ it.effect("split - should output empty chunk when stream is empty", () =>
4385
+ Effect.gen(function*() {
4386
+ const result = yield* pipe(
4387
+ Stream.empty,
4388
+ Stream.split((n: number) => n % 11 === 0),
4389
+ Stream.runCollect
4390
+ )
4391
+ deepStrictEqual(result, [])
4392
+ }))
4393
+ })
4394
+
4395
+ describe("timeout", () => {
4396
+ it.effect("timeoutOrElse - succeed", () =>
4397
+ Effect.gen(function*() {
4398
+ const result = yield* pipe(
4399
+ Stream.succeed(1),
4400
+ Stream.timeoutOrElse({
4401
+ duration: Duration.infinity,
4402
+ orElse: () => Stream.succeed(-1)
4403
+ }),
4404
+ Stream.runCollect
4405
+ )
4406
+ deepStrictEqual(result, [1])
4407
+ }))
4408
+
4409
+ it.effect("timeoutOrElse - should switch streams", () =>
4410
+ Effect.gen(function*() {
4411
+ const result = yield* pipe(
4412
+ Stream.range(0, 4),
4413
+ Stream.tap(() => Effect.sleep(Duration.infinity)),
4414
+ Stream.timeoutOrElse({
4415
+ duration: Duration.zero,
4416
+ orElse: () => Stream.succeed(4)
4417
+ }),
4418
+ Stream.runCollect
4419
+ )
4420
+ deepStrictEqual(result, [4])
4421
+ }))
4422
+
4423
+ it.effect("timeoutOrElse - should not apply timeout after switch", () =>
4424
+ Effect.gen(function*() {
4425
+ const fiber = yield* pipe(
4426
+ Stream.never,
4427
+ Stream.timeoutOrElse({
4428
+ duration: Duration.zero,
4429
+ orElse: () =>
4430
+ Stream.succeed(1).pipe(
4431
+ Stream.tap(() => Effect.sleep(Duration.seconds(1)))
4432
+ )
4433
+ }),
4434
+ Stream.runCollect,
4435
+ Effect.forkChild({ startImmediately: true })
4436
+ )
4437
+ yield* TestClock.adjust(Duration.seconds(1))
4438
+ const result = yield* Fiber.join(fiber)
4439
+ deepStrictEqual(result, [1])
4440
+ }))
4441
+
4442
+ it.effect("timeout - succeed", () =>
4443
+ Effect.gen(function*() {
4444
+ const result = yield* pipe(
4445
+ Stream.succeed(1),
4446
+ Stream.timeout(Duration.infinity),
4447
+ Stream.runCollect
4448
+ )
4449
+ deepStrictEqual(result, [1])
4450
+ }))
4451
+
4452
+ it.effect("timeout - should end the stream", () =>
4453
+ Effect.gen(function*() {
4454
+ const result = yield* pipe(
4455
+ Stream.range(0, 4),
4456
+ Stream.tap(() => Effect.sleep(Duration.infinity)),
4457
+ Stream.timeout(Duration.zero),
4458
+ Stream.runCollect
4459
+ )
4460
+ deepStrictEqual(result, [])
4461
+ }))
4462
+ })
4463
+
4464
+ describe("when", () => {
4465
+ it.effect("when - returns the stream if the condition is satisfied", () =>
4466
+ Effect.gen(function*() {
4467
+ const stream = Stream.make(1, 2, 3, 4, 5)
4468
+ const { result1, result2 } = yield* (Effect.all({
4469
+ result1: pipe(stream, Stream.when(Effect.succeed(true)), Stream.runCollect),
4470
+ result2: Stream.runCollect(stream)
4471
+ }))
4472
+ deepStrictEqual(result1, result2)
4473
+ }))
4474
+
4475
+ it.effect("when - returns an empty stream if the condition is not satisfied", () =>
4476
+ Effect.gen(function*() {
4477
+ const result = yield* pipe(
4478
+ Stream.make(1, 2, 3, 4, 5),
4479
+ Stream.when(Effect.succeed(false)),
4480
+ Stream.runCollect
4481
+ )
4482
+ deepStrictEqual(result, [])
4483
+ }))
4484
+
4485
+ it.effect("when - dies if the condition throws an exception", () =>
4486
+ Effect.gen(function*() {
4487
+ const error = "boom"
4488
+ const result = yield* pipe(
4489
+ Stream.make(1, 2, 3),
4490
+ Stream.when(Effect.sync(() => {
4491
+ throw error
4492
+ })),
4493
+ Stream.runDrain,
4494
+ Effect.exit
4495
+ )
4496
+ deepStrictEqual(result, Exit.die(error))
4497
+ }))
4498
+
4499
+ it.effect("when - returns the stream if the effectful condition is satisfied", () =>
4500
+ Effect.gen(function*() {
4501
+ const result = yield* pipe(
4502
+ Stream.make(1, 2, 3, 4, 5),
4503
+ Stream.when(Effect.succeed(true)),
4504
+ Stream.runCollect
4505
+ )
4506
+ deepStrictEqual(result, [1, 2, 3, 4, 5])
4507
+ }))
4508
+
4509
+ it.effect("when - returns an empty stream if the effectful condition is not satisfied", () =>
4510
+ Effect.gen(function*() {
4511
+ const result = yield* pipe(
4512
+ Stream.make(1, 2, 3, 4, 5),
4513
+ Stream.when(Effect.succeed(false)),
4514
+ Stream.runCollect
4515
+ )
4516
+ deepStrictEqual(result, [])
4517
+ }))
4518
+
4519
+ it.effect("when - fails if the effectful condition fails", () =>
4520
+ Effect.gen(function*() {
4521
+ const error = "boom"
4522
+ const result = yield* pipe(
4523
+ Stream.make(1, 2, 3),
4524
+ Stream.when(Effect.fail(error)),
4525
+ Stream.runDrain,
4526
+ Effect.exit
4527
+ )
4528
+ deepStrictEqual(result, Exit.fail(error))
4529
+ }))
4530
+ })
4531
+
4532
+ describe("zipWithNext", () => {
4533
+ it.effect("zipWithNext", () =>
4534
+ Effect.gen(function*() {
4535
+ const result = yield* pipe(
4536
+ Stream.make(1, 2, 3),
4537
+ Stream.zipWithNext,
4538
+ Stream.runCollect
4539
+ )
4540
+ deepStrictEqual(result, [
4541
+ [1, Option.some(2)],
4542
+ [2, Option.some(3)],
4543
+ [3, Option.none()]
4544
+ ])
4545
+ }))
4546
+
4547
+ it.effect("zipWithNext - should work with multiple chunks", () =>
4548
+ Effect.gen(function*() {
4549
+ const result = yield* pipe(
4550
+ Stream.fromArrays([1], [2], [3]),
4551
+ Stream.zipWithNext,
4552
+ Stream.runCollect
4553
+ )
4554
+ deepStrictEqual(result, [
4555
+ [1, Option.some(2)],
4556
+ [2, Option.some(3)],
4557
+ [3, Option.none()]
4558
+ ])
4559
+ }))
4560
+
4561
+ it.effect("zipWithNext - should work with an empty stream", () =>
4562
+ Effect.gen(function*() {
4563
+ const result = yield* pipe(
4564
+ Stream.empty,
4565
+ Stream.zipWithNext,
4566
+ Stream.runCollect
4567
+ )
4568
+ deepStrictEqual(result, [])
4569
+ }))
4570
+
4571
+ it.effect("zipWithPrevious - should zip with previous element for a single chunk", () =>
4572
+ Effect.gen(function*() {
4573
+ const result = yield* pipe(
4574
+ Stream.make(1, 2, 3),
4575
+ Stream.zipWithPrevious,
4576
+ Stream.runCollect
4577
+ )
4578
+ deepStrictEqual(result, [
4579
+ [Option.none(), 1],
4580
+ [Option.some(1), 2],
4581
+ [Option.some(2), 3]
4582
+ ])
4583
+ }))
4584
+
4585
+ it.effect("zipWithPrevious - should work with multiple chunks", () =>
4586
+ Effect.gen(function*() {
4587
+ const result = yield* pipe(
4588
+ Stream.fromArrays([1], [2], [3]),
4589
+ Stream.zipWithPrevious,
4590
+ Stream.runCollect
4591
+ )
4592
+ deepStrictEqual(result, [
4593
+ [Option.none(), 1],
4594
+ [Option.some(1), 2],
4595
+ [Option.some(2), 3]
4596
+ ])
4597
+ }))
4598
+
4599
+ it.effect("zipWithPrevious - should work with an empty stream", () =>
4600
+ Effect.gen(function*() {
4601
+ const result = yield* pipe(
4602
+ Stream.empty,
4603
+ Stream.zipWithPrevious,
4604
+ Stream.runCollect
4605
+ )
4606
+ deepStrictEqual(result, [])
4607
+ }))
4608
+
4609
+ it("zipWithPrevious - should output same values as first element plus zipping with init", () =>
4610
+ fc.assert(fc.asyncProperty(fc.array(fc.array(fc.integer())), async (chunks) => {
4611
+ const stream = Stream.fromArrays(...chunks)
4612
+ const { result1, result2 } = await Effect.runPromise(Effect.all({
4613
+ result1: pipe(
4614
+ stream,
4615
+ Stream.zipWithPrevious,
4616
+ Stream.runCollect
4617
+ ),
4618
+ result2: pipe(
4619
+ Stream.make(Option.none()),
4620
+ Stream.concat(pipe(stream, Stream.map(Option.some))),
4621
+ Stream.zip(stream),
4622
+ Stream.runCollect
4623
+ )
4624
+ }))
4625
+ deepStrictEqual(result1, result2)
4626
+ })))
4627
+
4628
+ it.effect("zipWithPreviousAndNext", () =>
4629
+ Effect.gen(function*() {
4630
+ const result = yield* pipe(
4631
+ Stream.make(1, 2, 3),
4632
+ Stream.zipWithPreviousAndNext,
4633
+ Stream.runCollect
4634
+ )
4635
+ deepStrictEqual(result, [
4636
+ [Option.none(), 1, Option.some(2)],
4637
+ [Option.some(1), 2, Option.some(3)],
4638
+ [Option.some(2), 3, Option.none()]
4639
+ ])
4640
+ }))
4641
+
4642
+ it("zipWithPreviousAndNext - should output same values as zipping with both previous and next element", () =>
4643
+ fc.assert(fc.asyncProperty(fc.array(fc.array(fc.integer()), { minLength: 0, maxLength: 5 }), async (chunks) => {
4644
+ const stream = Stream.fromArrays(...chunks)
4645
+ const previous = pipe(
4646
+ Stream.make(Option.none()),
4647
+ Stream.concat(pipe(stream, Stream.map(Option.some)))
4648
+ )
4649
+ const next = pipe(
4650
+ stream,
4651
+ Stream.drop(1),
4652
+ Stream.map(Option.some),
4653
+ Stream.concat(Stream.make(Option.none()))
4654
+ )
4655
+ const { result1, result2 } = await pipe(
4656
+ Effect.all({
4657
+ result1: pipe(
4658
+ stream,
4659
+ Stream.zipWithPreviousAndNext,
4660
+ Stream.runCollect
4661
+ ),
4662
+ result2: pipe(
4663
+ previous,
4664
+ Stream.zip(stream),
4665
+ Stream.zipFlatten(next),
4666
+ Stream.runCollect
4667
+ )
4668
+ }),
4669
+ Effect.runPromise
4670
+ )
4671
+ deepStrictEqual(result1, result2)
4672
+ })))
4673
+ })
4674
+
4675
+ describe("broadcastN", () => {
4676
+ it.effect("fans out to a fixed number of streams", () =>
4677
+ Effect.scoped(Effect.gen(function*() {
4678
+ const [left, right] = yield* Stream.make(1, 2, 3).pipe(
4679
+ Stream.broadcastN({ n: 2, capacity: 4 })
4680
+ )
4681
+
4682
+ const result = yield* Effect.all([
4683
+ Stream.runCollect(left),
4684
+ Stream.runCollect(right)
4685
+ ], { concurrency: "unbounded" })
4686
+
4687
+ assert.deepStrictEqual(result, [[1, 2, 3], [1, 2, 3]])
4688
+ })))
4689
+
4690
+ it.effect("propagates failures to all downstream streams", () =>
4691
+ Effect.scoped(Effect.gen(function*() {
4692
+ const [left, right] = yield* Stream.fail("boom").pipe(
4693
+ Stream.broadcastN({ n: 2, capacity: 4 })
4694
+ )
4695
+
4696
+ const result = yield* Effect.all([
4697
+ Stream.runCollect(left).pipe(Effect.exit),
4698
+ Stream.runCollect(right).pipe(Effect.exit)
4699
+ ], { concurrency: "unbounded" })
4700
+
4701
+ assert.deepStrictEqual(result, [Exit.fail("boom"), Exit.fail("boom")])
4702
+ })))
4703
+ })
4704
+ })
4705
+
4706
+ const grouped = <A>(arr: Array<A>, size: number): Array<NonEmptyArray<A>> => {
4707
+ const builder: Array<NonEmptyArray<A>> = []
4708
+ for (let i = 0; i < arr.length; i = i + size) {
4709
+ builder.push(arr.slice(i, i + size) as NonEmptyArray<A>)
4710
+ }
4711
+ return builder
4712
+ }