redscript-mc 2.6.2 → 3.0.0

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 (636) hide show
  1. package/.github/workflows/ci.yml +11 -0
  2. package/CHANGELOG.md +18 -9
  3. package/README-benchmarks.md +48 -0
  4. package/README-vscode-test.md +251 -0
  5. package/RELEASE_NOTES.md +74 -0
  6. package/ROADMAP.md +131 -167
  7. package/benchmarks/_shared.ts +468 -0
  8. package/benchmarks/baseline.json +2816 -0
  9. package/benchmarks/baseline.md +13 -0
  10. package/benchmarks/compiler-perf.report.json +207 -0
  11. package/benchmarks/compiler-perf.ts +76 -0
  12. package/benchmarks/results.md +13 -0
  13. package/benchmarks/stdlib-complexity.report.json +2606 -0
  14. package/benchmarks/stdlib-complexity.ts +54 -0
  15. package/benchmarks/stdlib-size.md +57 -0
  16. package/benchmarks/stdlib-size.ts +91 -0
  17. package/coverage-report.md +177 -0
  18. package/dist/src/__tests__/budget.test.js +4 -0
  19. package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
  20. package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
  21. package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
  22. package/dist/src/__tests__/cache-extra.test.js +211 -0
  23. package/dist/src/__tests__/cli-init.test.d.ts +1 -0
  24. package/dist/src/__tests__/cli-init.test.js +97 -0
  25. package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
  26. package/dist/src/__tests__/cli-publish.test.js +189 -0
  27. package/dist/src/__tests__/cli.test.js +76 -0
  28. package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
  29. package/dist/src/__tests__/compile-preprocess.test.js +328 -0
  30. package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
  31. package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
  32. package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
  33. package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
  34. package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
  35. package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
  36. package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
  37. package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
  38. package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
  39. package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
  40. package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
  41. package/dist/src/__tests__/compiler/do-while.test.js +120 -0
  42. package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
  43. package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
  44. package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
  45. package/dist/src/__tests__/compiler/interface.test.js +258 -0
  46. package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
  47. package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
  48. package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
  49. package/dist/src/__tests__/compiler/match-string.test.js +43 -0
  50. package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
  51. package/dist/src/__tests__/compiler/memoize.test.js +113 -0
  52. package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
  53. package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
  54. package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
  55. package/dist/src/__tests__/compiler/module-import.test.js +261 -0
  56. package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
  57. package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
  58. package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
  59. package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
  60. package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
  61. package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
  62. package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
  63. package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
  64. package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
  65. package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
  66. package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
  67. package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
  68. package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
  69. package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
  70. package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
  71. package/dist/src/__tests__/config/project-config.test.js +199 -0
  72. package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
  73. package/dist/src/__tests__/config-decorator.test.js +142 -0
  74. package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
  75. package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
  76. package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
  77. package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
  78. package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
  79. package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
  80. package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
  81. package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
  82. package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
  83. package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
  84. package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
  85. package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
  86. package/dist/src/__tests__/emit/index.test.js +2 -1
  87. package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
  88. package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
  89. package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
  90. package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
  91. package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
  92. package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
  93. package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
  94. package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
  95. package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
  96. package/dist/src/__tests__/emit/source-map.test.js +167 -0
  97. package/dist/src/__tests__/enum.test.js +9 -4
  98. package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
  99. package/dist/src/__tests__/error-recovery.test.js +217 -0
  100. package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
  101. package/dist/src/__tests__/events-types-extra.test.js +91 -0
  102. package/dist/src/__tests__/events-types.test.d.ts +4 -0
  103. package/dist/src/__tests__/events-types.test.js +56 -0
  104. package/dist/src/__tests__/formatter.test.js +13 -5
  105. package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
  106. package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
  107. package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
  108. package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
  109. package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
  110. package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
  111. package/dist/src/__tests__/incremental.test.js +10 -2
  112. package/dist/src/__tests__/index-extra.test.d.ts +10 -0
  113. package/dist/src/__tests__/index-extra.test.js +71 -0
  114. package/dist/src/__tests__/lexer.test.js +2 -2
  115. package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
  116. package/dist/src/__tests__/lint/rules.test.js +208 -0
  117. package/dist/src/__tests__/lir/lower.test.js +29 -0
  118. package/dist/src/__tests__/lir/verify.test.js +30 -0
  119. package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
  120. package/dist/src/__tests__/lsp/completion.test.js +583 -0
  121. package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
  122. package/dist/src/__tests__/lsp/definition.test.js +454 -0
  123. package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
  124. package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
  125. package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
  126. package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
  127. package/dist/src/__tests__/lsp.test.js +4 -1
  128. package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
  129. package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
  130. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
  131. package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
  132. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
  133. package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
  134. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
  135. package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
  136. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
  137. package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
  138. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
  139. package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
  140. package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
  141. package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
  142. package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
  143. package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
  144. package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
  145. package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
  146. package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
  147. package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
  148. package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
  149. package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
  150. package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
  151. package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
  152. package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
  153. package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
  154. package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
  155. package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
  156. package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
  157. package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
  158. package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
  159. package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
  160. package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
  161. package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
  162. package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
  163. package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
  164. package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
  165. package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
  166. package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
  167. package/dist/src/__tests__/optimizer/cse.test.js +178 -0
  168. package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
  169. package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
  170. package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
  171. package/dist/src/__tests__/optimizer/licm.test.js +244 -0
  172. package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
  173. package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
  174. package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
  175. package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
  176. package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
  177. package/dist/src/__tests__/optimizer/tco.test.js +203 -0
  178. package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
  179. package/dist/src/__tests__/parser-coverage.test.js +491 -0
  180. package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
  181. package/dist/src/__tests__/parser-extra.test.js +451 -0
  182. package/dist/src/__tests__/parser.test.js +12 -0
  183. package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
  184. package/dist/src/__tests__/repl-extra.test.js +174 -0
  185. package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
  186. package/dist/src/__tests__/repl-server-extra.test.js +161 -0
  187. package/dist/src/__tests__/repl-server.test.d.ts +6 -0
  188. package/dist/src/__tests__/repl-server.test.js +146 -0
  189. package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
  190. package/dist/src/__tests__/runtime-extra.test.js +732 -0
  191. package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
  192. package/dist/src/__tests__/singleton-decorator.test.js +260 -0
  193. package/dist/src/__tests__/sourcemap.test.js +1 -1
  194. package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
  195. package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
  196. package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
  197. package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
  198. package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
  199. package/dist/src/__tests__/stdlib/bits.test.js +96 -0
  200. package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
  201. package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
  202. package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
  203. package/dist/src/__tests__/stdlib/color.test.js +84 -0
  204. package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
  205. package/dist/src/__tests__/stdlib/combat.test.js +64 -0
  206. package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
  207. package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
  208. package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
  209. package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
  210. package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
  211. package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
  212. package/dist/src/__tests__/stdlib/effects.test.js +72 -0
  213. package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
  214. package/dist/src/__tests__/stdlib/events.test.js +55 -0
  215. package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
  216. package/dist/src/__tests__/stdlib/expr.test.js +77 -0
  217. package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
  218. package/dist/src/__tests__/stdlib/fft.test.js +82 -0
  219. package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
  220. package/dist/src/__tests__/stdlib/graph.test.js +102 -0
  221. package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
  222. package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
  223. package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
  224. package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
  225. package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
  226. package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
  227. package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
  228. package/dist/src/__tests__/stdlib/map.test.js +84 -0
  229. package/dist/src/__tests__/stdlib/math.test.js +19 -6
  230. package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
  231. package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
  232. package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
  233. package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
  234. package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
  235. package/dist/src/__tests__/stdlib/noise.test.js +73 -0
  236. package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
  237. package/dist/src/__tests__/stdlib/ode.test.js +68 -0
  238. package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
  239. package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
  240. package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
  241. package/dist/src/__tests__/stdlib/particles.test.js +68 -0
  242. package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
  243. package/dist/src/__tests__/stdlib/physics.test.js +76 -0
  244. package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
  245. package/dist/src/__tests__/stdlib/player.test.js +64 -0
  246. package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
  247. package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
  248. package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
  249. package/dist/src/__tests__/stdlib/queue.test.js +97 -0
  250. package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
  251. package/dist/src/__tests__/stdlib/random.test.js +76 -0
  252. package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
  253. package/dist/src/__tests__/stdlib/result.test.js +329 -0
  254. package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
  255. package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
  256. package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
  257. package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
  258. package/dist/src/__tests__/stdlib/sets.test.js +60 -0
  259. package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
  260. package/dist/src/__tests__/stdlib/signal.test.js +84 -0
  261. package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
  262. package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
  263. package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
  264. package/dist/src/__tests__/stdlib/string.test.js +231 -0
  265. package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
  266. package/dist/src/__tests__/stdlib/strings.test.js +83 -0
  267. package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
  268. package/dist/src/__tests__/stdlib/tags.test.js +57 -0
  269. package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
  270. package/dist/src/__tests__/stdlib/teams.test.js +72 -0
  271. package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
  272. package/dist/src/__tests__/stdlib/timer.test.js +79 -0
  273. package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
  274. package/dist/src/__tests__/stdlib/vec.test.js +94 -0
  275. package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
  276. package/dist/src/__tests__/stdlib/world.test.js +72 -0
  277. package/dist/src/__tests__/struct-display.test.d.ts +1 -0
  278. package/dist/src/__tests__/struct-display.test.js +64 -0
  279. package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
  280. package/dist/src/__tests__/test-framework/runner.test.js +193 -0
  281. package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
  282. package/dist/src/__tests__/tuner/adapters.test.js +194 -0
  283. package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
  284. package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
  285. package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
  286. package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
  287. package/dist/src/__tests__/typechecker.test.js +3 -3
  288. package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
  289. package/dist/src/__tests__/watch-decorator.test.js +54 -0
  290. package/dist/src/ast/types.d.ts +102 -3
  291. package/dist/src/cache/incremental.d.ts +13 -14
  292. package/dist/src/cache/incremental.js +106 -89
  293. package/dist/src/cache/index.d.ts +8 -2
  294. package/dist/src/cache/index.js +18 -6
  295. package/dist/src/cli.d.ts +1 -0
  296. package/dist/src/cli.js +466 -17
  297. package/dist/src/config/project-config.d.ts +29 -0
  298. package/dist/src/config/project-config.js +180 -0
  299. package/dist/src/diagnostics/index.d.ts +9 -0
  300. package/dist/src/diagnostics/index.js +18 -1
  301. package/dist/src/emit/compile.d.ts +10 -0
  302. package/dist/src/emit/compile.js +395 -50
  303. package/dist/src/emit/index.d.ts +40 -0
  304. package/dist/src/emit/index.js +307 -14
  305. package/dist/src/emit/modules.js +21 -3
  306. package/dist/src/emit/sourcemap.d.ts +23 -27
  307. package/dist/src/emit/sourcemap.js +52 -30
  308. package/dist/src/formatter/index.js +33 -8
  309. package/dist/src/hir/deprecated.d.ts +13 -0
  310. package/dist/src/hir/deprecated.js +218 -0
  311. package/dist/src/hir/lower.js +114 -8
  312. package/dist/src/hir/monomorphize.js +22 -2
  313. package/dist/src/hir/types.d.ts +65 -1
  314. package/dist/src/index.d.ts +6 -0
  315. package/dist/src/index.js +18 -3
  316. package/dist/src/lexer/index.d.ts +2 -1
  317. package/dist/src/lexer/index.js +39 -3
  318. package/dist/src/lint/index.d.ts +45 -0
  319. package/dist/src/lint/index.js +930 -0
  320. package/dist/src/lir/lower.js +29 -2
  321. package/dist/src/lir/types.d.ts +2 -0
  322. package/dist/src/lsp/server.js +92 -5
  323. package/dist/src/mir/lower.js +775 -34
  324. package/dist/src/mir/macro.js +36 -2
  325. package/dist/src/mir/types.d.ts +12 -0
  326. package/dist/src/mir/verify.js +9 -0
  327. package/dist/src/optimizer/auto-inline.d.ts +2 -0
  328. package/dist/src/optimizer/auto-inline.js +67 -0
  329. package/dist/src/optimizer/cse.d.ts +20 -0
  330. package/dist/src/optimizer/cse.js +234 -0
  331. package/dist/src/optimizer/inline.d.ts +26 -0
  332. package/dist/src/optimizer/inline.js +286 -0
  333. package/dist/src/optimizer/interprocedural.js +4 -0
  334. package/dist/src/optimizer/licm.d.ts +32 -0
  335. package/dist/src/optimizer/licm.js +371 -0
  336. package/dist/src/optimizer/pipeline.js +12 -2
  337. package/dist/src/optimizer/strength_reduction.d.ts +15 -0
  338. package/dist/src/optimizer/strength_reduction.js +90 -0
  339. package/dist/src/optimizer/tco.d.ts +53 -0
  340. package/dist/src/optimizer/tco.js +238 -0
  341. package/dist/src/parser/index.d.ts +32 -0
  342. package/dist/src/parser/index.js +421 -59
  343. package/dist/src/repl-server.d.ts +13 -0
  344. package/dist/src/repl-server.js +127 -0
  345. package/dist/src/structs/expand.d.ts +15 -0
  346. package/dist/src/structs/expand.js +46 -0
  347. package/dist/src/testing/runner.d.ts +40 -0
  348. package/dist/src/testing/runner.js +237 -0
  349. package/dist/src/typechecker/index.d.ts +3 -0
  350. package/dist/src/typechecker/index.js +254 -9
  351. package/dist/tsconfig.tsbuildinfo +1 -1
  352. package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
  353. package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
  354. package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
  355. package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
  356. package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
  357. package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
  358. package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
  359. package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
  360. package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
  361. package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
  362. package/docs/stdlib/result.md +156 -0
  363. package/docs/stdlib/result.zh.md +156 -0
  364. package/editors/vscode/fixtures/test.mcrs +7 -0
  365. package/editors/vscode/out/extension.js +2095 -225
  366. package/editors/vscode/out/lsp-server.js +519 -51
  367. package/editors/vscode/package-lock.json +9 -4
  368. package/editors/vscode/package.json +1 -1
  369. package/examples/display-demo.mcrs +64 -0
  370. package/examples/game/racing.mcrs +301 -0
  371. package/examples/game/tower_defense.mcrs +311 -0
  372. package/examples/math/physics_sim.mcrs +322 -0
  373. package/examples/rpg/boss_fight.mcrs +313 -0
  374. package/examples/rpg/health_system.mcrs +237 -0
  375. package/examples/rpg/inventory.mcrs +265 -0
  376. package/examples/util/debug_hud.mcrs +279 -0
  377. package/jest.config.js +10 -0
  378. package/package.json +12 -3
  379. package/playground/index.html +823 -0
  380. package/scripts/gen-docs.ts +533 -0
  381. package/scripts/update-redscript-docs-stdlib.sh +770 -0
  382. package/src/__tests__/budget.test.ts +5 -0
  383. package/src/__tests__/cache/cache-behavior.test.ts +480 -0
  384. package/src/__tests__/cache-extra.test.ts +199 -0
  385. package/src/__tests__/cli-docs.test.ts +77 -0
  386. package/src/__tests__/cli-init.test.ts +91 -0
  387. package/src/__tests__/cli-publish.test.ts +190 -0
  388. package/src/__tests__/cli.test.ts +117 -1
  389. package/src/__tests__/compile-preprocess.test.ts +366 -0
  390. package/src/__tests__/compiler/break-stmt.test.ts +66 -0
  391. package/src/__tests__/compiler/const-decl.test.ts +141 -0
  392. package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
  393. package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
  394. package/src/__tests__/compiler/deprecated.test.ts +305 -0
  395. package/src/__tests__/compiler/do-while.test.ts +130 -0
  396. package/src/__tests__/compiler/enum-payload.test.ts +299 -0
  397. package/src/__tests__/compiler/interface.test.ts +287 -0
  398. package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
  399. package/src/__tests__/compiler/match-string.test.ts +45 -0
  400. package/src/__tests__/compiler/memoize.test.ts +126 -0
  401. package/src/__tests__/compiler/method-chain.test.ts +121 -0
  402. package/src/__tests__/compiler/module-import.test.ts +240 -0
  403. package/src/__tests__/compiler/option-extensions.test.ts +207 -0
  404. package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
  405. package/src/__tests__/compiler/string-advanced.test.ts +310 -0
  406. package/src/__tests__/compiler/struct-extends.test.ts +109 -0
  407. package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
  408. package/src/__tests__/compiler/tuple-type.test.ts +263 -0
  409. package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
  410. package/src/__tests__/config/project-config.test.ts +181 -0
  411. package/src/__tests__/config-decorator.test.ts +157 -0
  412. package/src/__tests__/diagnostics-extra.test.ts +155 -0
  413. package/src/__tests__/emit/compile-branches.test.ts +135 -0
  414. package/src/__tests__/emit/compile-coverage.test.ts +696 -0
  415. package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
  416. package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
  417. package/src/__tests__/emit/compile.test.ts +6 -1
  418. package/src/__tests__/emit/execute-chain.test.ts +114 -0
  419. package/src/__tests__/emit/index.test.ts +2 -1
  420. package/src/__tests__/emit/modules-branches.test.ts +90 -0
  421. package/src/__tests__/emit/modules-coverage.test.ts +241 -0
  422. package/src/__tests__/emit/modules-errors.test.ts +192 -0
  423. package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
  424. package/src/__tests__/emit/source-map.test.ts +152 -0
  425. package/src/__tests__/enum.test.ts +9 -4
  426. package/src/__tests__/error-recovery.test.ts +226 -0
  427. package/src/__tests__/events-types-extra.test.ts +110 -0
  428. package/src/__tests__/events-types.test.ts +66 -0
  429. package/src/__tests__/formatter.test.ts +15 -5
  430. package/src/__tests__/generics.test.ts +16 -9
  431. package/src/__tests__/hir/lower-extra.test.ts +151 -0
  432. package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
  433. package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
  434. package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
  435. package/src/__tests__/impl.test.ts +12 -8
  436. package/src/__tests__/incremental.test.ts +10 -2
  437. package/src/__tests__/index-extra.test.ts +79 -0
  438. package/src/__tests__/lexer.test.ts +2 -2
  439. package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
  440. package/src/__tests__/lint/rules-coverage.test.ts +598 -0
  441. package/src/__tests__/lint/rules.test.ts +230 -0
  442. package/src/__tests__/lir/lower.test.ts +33 -0
  443. package/src/__tests__/lir/verify.test.ts +33 -0
  444. package/src/__tests__/lsp/completion.test.ts +687 -0
  445. package/src/__tests__/lsp/definition.test.ts +499 -0
  446. package/src/__tests__/lsp/diagnostics.test.ts +108 -0
  447. package/src/__tests__/lsp/hover-docs.test.ts +222 -0
  448. package/src/__tests__/lsp.test.ts +4 -1
  449. package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
  450. package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
  451. package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
  452. package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
  453. package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
  454. package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
  455. package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
  456. package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
  457. package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
  458. package/src/__tests__/mc-validator-coverage.test.ts +325 -0
  459. package/src/__tests__/mc-validator-extra.test.ts +252 -0
  460. package/src/__tests__/mir/lower-extra.test.ts +402 -0
  461. package/src/__tests__/mir/lower-extra2.test.ts +348 -0
  462. package/src/__tests__/mir/lower-extra3.test.ts +277 -0
  463. package/src/__tests__/mir/lower-extra4.test.ts +636 -0
  464. package/src/__tests__/mir/lower-extra5.test.ts +612 -0
  465. package/src/__tests__/mir/lower-extra6.test.ts +520 -0
  466. package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
  467. package/src/__tests__/mir/lower-extra8.test.ts +704 -0
  468. package/src/__tests__/mir/lower-extra9.test.ts +821 -0
  469. package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
  470. package/src/__tests__/optimizer/cse.test.ts +195 -0
  471. package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
  472. package/src/__tests__/optimizer/licm.test.ts +358 -0
  473. package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
  474. package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
  475. package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
  476. package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
  477. package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
  478. package/src/__tests__/optimizer/tco.test.ts +238 -0
  479. package/src/__tests__/option.test.ts +14 -7
  480. package/src/__tests__/parser-coverage.test.ts +576 -0
  481. package/src/__tests__/parser-extra.test.ts +531 -0
  482. package/src/__tests__/parser.test.ts +14 -0
  483. package/src/__tests__/repl-extra.test.ts +195 -0
  484. package/src/__tests__/repl-server-extra.test.ts +150 -0
  485. package/src/__tests__/repl-server.test.ts +122 -0
  486. package/src/__tests__/runtime-extra.test.ts +862 -0
  487. package/src/__tests__/singleton-decorator.test.ts +285 -0
  488. package/src/__tests__/sourcemap.test.ts +1 -1
  489. package/src/__tests__/stdlib/advanced.test.ts +312 -0
  490. package/src/__tests__/stdlib/bigint.test.ts +57 -0
  491. package/src/__tests__/stdlib/bits.test.ts +75 -0
  492. package/src/__tests__/stdlib/bossbar.test.ts +45 -0
  493. package/src/__tests__/stdlib/color.test.ts +60 -0
  494. package/src/__tests__/stdlib/combat.test.ts +35 -0
  495. package/src/__tests__/stdlib/cooldown.test.ts +35 -0
  496. package/src/__tests__/stdlib/dialog.test.ts +14 -6
  497. package/src/__tests__/stdlib/ecs.test.ts +54 -0
  498. package/src/__tests__/stdlib/effects.test.ts +45 -0
  499. package/src/__tests__/stdlib/events.test.ts +23 -0
  500. package/src/__tests__/stdlib/expr.test.ts +48 -0
  501. package/src/__tests__/stdlib/fft.test.ts +54 -0
  502. package/src/__tests__/stdlib/graph.test.ts +77 -0
  503. package/src/__tests__/stdlib/interactions.test.ts +30 -0
  504. package/src/__tests__/stdlib/inventory.test.ts +40 -0
  505. package/src/__tests__/stdlib/linalg.test.ts +52 -0
  506. package/src/__tests__/stdlib/map.test.ts +55 -0
  507. package/src/__tests__/stdlib/math.test.ts +19 -5
  508. package/src/__tests__/stdlib/math_hp.test.ts +55 -0
  509. package/src/__tests__/stdlib/mobs.test.ts +40 -0
  510. package/src/__tests__/stdlib/noise.test.ts +46 -0
  511. package/src/__tests__/stdlib/ode.test.ts +40 -0
  512. package/src/__tests__/stdlib/parabola.test.ts +51 -0
  513. package/src/__tests__/stdlib/particles.test.ts +40 -0
  514. package/src/__tests__/stdlib/physics.test.ts +50 -0
  515. package/src/__tests__/stdlib/player.test.ts +35 -0
  516. package/src/__tests__/stdlib/quaternion.test.ts +46 -0
  517. package/src/__tests__/stdlib/queue.test.ts +73 -0
  518. package/src/__tests__/stdlib/random.test.ts +50 -0
  519. package/src/__tests__/stdlib/result.test.ts +326 -0
  520. package/src/__tests__/stdlib/scheduler.test.ts +18 -7
  521. package/src/__tests__/stdlib/set_int.test.ts +62 -0
  522. package/src/__tests__/stdlib/sets.test.ts +28 -0
  523. package/src/__tests__/stdlib/signal.test.ts +60 -0
  524. package/src/__tests__/stdlib/spawn.test.ts +40 -0
  525. package/src/__tests__/stdlib/string.test.ts +224 -0
  526. package/src/__tests__/stdlib/strings.test.ts +55 -0
  527. package/src/__tests__/stdlib/tags.test.ts +32 -0
  528. package/src/__tests__/stdlib/teams.test.ts +45 -0
  529. package/src/__tests__/stdlib/timer.test.ts +53 -0
  530. package/src/__tests__/stdlib/vec.test.ts +72 -0
  531. package/src/__tests__/stdlib/world.test.ts +45 -0
  532. package/src/__tests__/struct-display.test.ts +69 -0
  533. package/src/__tests__/test-framework/runner.test.ts +208 -0
  534. package/src/__tests__/tuner/adapters.test.ts +232 -0
  535. package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
  536. package/src/__tests__/tuple.test.ts +11 -4
  537. package/src/__tests__/typechecker-coverage.test.ts +671 -0
  538. package/src/__tests__/typechecker.test.ts +4 -3
  539. package/src/__tests__/watch-decorator.test.ts +59 -0
  540. package/src/ast/types.ts +65 -3
  541. package/src/cache/incremental.ts +128 -99
  542. package/src/cache/index.ts +35 -8
  543. package/src/cli.ts +538 -29
  544. package/src/config/project-config.ts +176 -0
  545. package/src/diagnostics/index.ts +22 -0
  546. package/src/docs.ts +98 -0
  547. package/src/emit/compile.ts +408 -51
  548. package/src/emit/index.ts +366 -18
  549. package/src/emit/modules.ts +19 -3
  550. package/src/emit/sourcemap.ts +64 -43
  551. package/src/formatter/index.ts +35 -8
  552. package/src/hir/deprecated.ts +212 -0
  553. package/src/hir/lower.ts +128 -8
  554. package/src/hir/monomorphize.ts +24 -2
  555. package/src/hir/types.ts +26 -1
  556. package/src/index.ts +23 -3
  557. package/src/lexer/index.ts +45 -6
  558. package/src/lint/index.ts +922 -0
  559. package/src/lir/lower.ts +30 -2
  560. package/src/lir/types.ts +4 -0
  561. package/src/lsp/server.ts +100 -1
  562. package/src/mir/lower.ts +785 -40
  563. package/src/mir/macro.ts +30 -2
  564. package/src/mir/types.ts +13 -0
  565. package/src/mir/verify.ts +10 -2
  566. package/src/optimizer/auto-inline.ts +86 -0
  567. package/src/optimizer/copy_prop.ts +2 -2
  568. package/src/optimizer/coroutine.ts +3 -3
  569. package/src/optimizer/cse.ts +205 -0
  570. package/src/optimizer/dce.ts +2 -2
  571. package/src/optimizer/inline.ts +335 -0
  572. package/src/optimizer/interprocedural.ts +5 -1
  573. package/src/optimizer/licm.ts +454 -0
  574. package/src/optimizer/nbt-coalesce.ts +109 -0
  575. package/src/optimizer/pipeline.ts +16 -2
  576. package/src/optimizer/scoreboard-batch.ts +52 -0
  577. package/src/optimizer/strength_reduction.ts +95 -0
  578. package/src/optimizer/tco.ts +267 -0
  579. package/src/optimizer/unroll.ts +2 -2
  580. package/src/parser/index.ts +426 -53
  581. package/src/repl-server.ts +102 -0
  582. package/src/stdlib/advanced.mcrs +271 -101
  583. package/src/stdlib/bigint.mcrs +97 -11
  584. package/src/stdlib/bits.mcrs +75 -12
  585. package/src/stdlib/bossbar.mcrs +37 -8
  586. package/src/stdlib/calculus.mcrs +82 -26
  587. package/src/stdlib/color.mcrs +98 -16
  588. package/src/stdlib/combat.mcrs +23 -5
  589. package/src/stdlib/cooldown.mcrs +19 -0
  590. package/src/stdlib/dialog.mcrs +45 -7
  591. package/src/stdlib/easing.mcrs +132 -12
  592. package/src/stdlib/ecs.mcrs +142 -25
  593. package/src/stdlib/effects.mcrs +88 -12
  594. package/src/stdlib/events.mcrs +21 -2
  595. package/src/stdlib/expr.mcrs +18 -3
  596. package/src/stdlib/fft.mcrs +66 -56
  597. package/src/stdlib/geometry.mcrs +137 -39
  598. package/src/stdlib/graph.mcrs +73 -0
  599. package/src/stdlib/heap.mcrs +49 -8
  600. package/src/stdlib/i18n/zh.yaml +2891 -0
  601. package/src/stdlib/interactions.mcrs +43 -20
  602. package/src/stdlib/inventory.mcrs +14 -3
  603. package/src/stdlib/linalg.mcrs +185 -30
  604. package/src/stdlib/list.mcrs +168 -18
  605. package/src/stdlib/map.mcrs +112 -0
  606. package/src/stdlib/math.mcrs +68 -18
  607. package/src/stdlib/math_hp.mcrs +124 -33
  608. package/src/stdlib/matrix.mcrs +133 -20
  609. package/src/stdlib/mobs.mcrs +87 -0
  610. package/src/stdlib/noise.mcrs +65 -21
  611. package/src/stdlib/ode.mcrs +96 -0
  612. package/src/stdlib/parabola.mcrs +104 -29
  613. package/src/stdlib/particles.mcrs +78 -21
  614. package/src/stdlib/pathfind.mcrs +89 -35
  615. package/src/stdlib/physics.mcrs +134 -26
  616. package/src/stdlib/player.mcrs +18 -0
  617. package/src/stdlib/quaternion.mcrs +213 -9
  618. package/src/stdlib/queue.mcrs +123 -0
  619. package/src/stdlib/random.mcrs +63 -18
  620. package/src/stdlib/result.mcrs +111 -0
  621. package/src/stdlib/scheduler.mcrs +59 -10
  622. package/src/stdlib/set_int.mcrs +240 -0
  623. package/src/stdlib/sets.mcrs +49 -19
  624. package/src/stdlib/signal.mcrs +151 -79
  625. package/src/stdlib/sort.mcrs +44 -24
  626. package/src/stdlib/spawn.mcrs +30 -7
  627. package/src/stdlib/state.mcrs +40 -5
  628. package/src/stdlib/strings.mcrs +131 -3
  629. package/src/stdlib/tags.mcrs +2 -2
  630. package/src/stdlib/teams.mcrs +22 -10
  631. package/src/stdlib/timer.mcrs +36 -6
  632. package/src/stdlib/vec.mcrs +44 -9
  633. package/src/stdlib/world.mcrs +57 -25
  634. package/src/structs/expand.ts +64 -0
  635. package/src/testing/runner.ts +271 -0
  636. package/src/typechecker/index.ts +273 -9
@@ -0,0 +1,770 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ DOCS_ROOT="${HOME}/projects/redscript-docs"
5
+ EN_DIR="${DOCS_ROOT}/docs/en/stdlib"
6
+ ZH_DIR="${DOCS_ROOT}/docs/zh/stdlib"
7
+
8
+ mkdir -p "${EN_DIR}" "${ZH_DIR}"
9
+
10
+ cat > "${EN_DIR}/linalg.md" <<'EOF'
11
+ # `linalg` — Double-precision linear algebra
12
+
13
+ Import: `import "stdlib/linalg.mcrs";`
14
+
15
+ Double-precision vector and 2×2 matrix helpers for RedScript datapacks. This module covers 2D/3D dot products, lengths, distances, 3D cross products, 2×2 determinants, matrix multiplication, matrix-vector multiplication, and solving a 2×2 linear system with Cramer's rule.
16
+
17
+ **Dependency:** `stdlib/math_hp.mcrs` for `double_sqrt`.
18
+
19
+ ## Data model
20
+
21
+ - All values are native IEEE 754 `double`.
22
+ - 2×2 matrices are passed as four scalars in row-major order: `[a b; c d]`.
23
+ - Cross products and normalization are exposed as one function per output component.
24
+
25
+ ## Quick example
26
+
27
+ ```rs
28
+ import "stdlib/linalg.mcrs";
29
+ import "stdlib/math_hp.mcrs";
30
+
31
+ let nx: double = vec3d_normalize_x(3.0d, 0.0d, 4.0d); // 0.6
32
+ let ny: double = vec3d_normalize_y(3.0d, 0.0d, 4.0d); // 0.0
33
+ let nz: double = vec3d_normalize_z(3.0d, 0.0d, 4.0d); // 0.8
34
+
35
+ let det: double = mat2d_det(2.0d, 1.0d, 1.0d, 3.0d); // 5.0
36
+ let x: double = solve2d_x(2.0d, 1.0d, 1.0d, 3.0d, 5.0d, 10.0d); // 1.0
37
+ let y: double = solve2d_y(2.0d, 1.0d, 1.0d, 3.0d, 5.0d, 10.0d); // 3.0
38
+ ```
39
+
40
+ ## 2D vectors
41
+
42
+ | Function | Description |
43
+ |:--|:--|
44
+ | `vec2d_dot(ax: double, ay: double, bx: double, by: double): double` | Dot product `ax*bx + ay*by`. |
45
+ | `vec2d_length(x: double, y: double): double` | Euclidean length `sqrt(x*x + y*y)`. |
46
+ | `vec2d_dist(ax: double, ay: double, bx: double, by: double): double` | Distance between two 2D points. |
47
+ | `vec2d_normalize_x(x: double, y: double): double` | X component of the normalized vector. |
48
+ | `vec2d_normalize_y(x: double, y: double): double` | Y component of the normalized vector. |
49
+
50
+ Example:
51
+
52
+ ```rs
53
+ let dot: double = vec2d_dot(3.0d, 4.0d, 3.0d, 4.0d); // 25.0
54
+ let len: double = vec2d_length(3.0d, 4.0d); // 5.0
55
+ let dist: double = vec2d_dist(0.0d, 0.0d, 3.0d, 4.0d); // 5.0
56
+ ```
57
+
58
+ ## 3D vectors
59
+
60
+ | Function | Description |
61
+ |:--|:--|
62
+ | `vec3d_dot(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | Dot product `ax*bx + ay*by + az*bz`. |
63
+ | `vec3d_length(x: double, y: double, z: double): double` | Euclidean length in 3D. |
64
+ | `vec3d_dist(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | Distance between two 3D points. |
65
+ | `vec3d_cross_x(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | X component of `a × b`. |
66
+ | `vec3d_cross_y(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | Y component of `a × b`. |
67
+ | `vec3d_cross_z(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | Z component of `a × b`. |
68
+ | `vec3d_normalize_x(x: double, y: double, z: double): double` | X component of the normalized vector. |
69
+ | `vec3d_normalize_y(x: double, y: double, z: double): double` | Y component of the normalized vector. |
70
+ | `vec3d_normalize_z(x: double, y: double, z: double): double` | Z component of the normalized vector. |
71
+
72
+ Example:
73
+
74
+ ```rs
75
+ let d: double = vec3d_dot(1.0d, 2.0d, 3.0d, 4.0d, 5.0d, 6.0d); // 32.0
76
+ let cz: double = vec3d_cross_z(1.0d, 0.0d, 0.0d, 0.0d, 1.0d, 0.0d); // 1.0
77
+ ```
78
+
79
+ ## 2×2 matrices
80
+
81
+ Matrix layout:
82
+
83
+ ```text
84
+ [ a b ]
85
+ [ c d ]
86
+ ```
87
+
88
+ | Function | Description |
89
+ |:--|:--|
90
+ | `mat2d_det(a: double, b: double, c: double, d: double): double` | Determinant `a*d - b*c`. |
91
+ | `mat2d_mul_r0c0(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | Product element `[0,0]` of `M0 × M1`. |
92
+ | `mat2d_mul_r0c1(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | Product element `[0,1]`. |
93
+ | `mat2d_mul_r1c0(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | Product element `[1,0]`. |
94
+ | `mat2d_mul_r1c1(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | Product element `[1,1]`. |
95
+ | `mat2d_vecmul_x(a: double, b: double, c: double, d: double, vx: double, vy: double): double` | X component of `M × v`. |
96
+ | `mat2d_vecmul_y(a: double, b: double, c: double, d: double, vx: double, vy: double): double` | Y component of `M × v`. |
97
+
98
+ Example:
99
+
100
+ ```rs
101
+ let det: double = mat2d_det(1.0d, 2.0d, 3.0d, 4.0d); // -2.0
102
+ let rx: double = mat2d_vecmul_x(0.0d, -1.0d, 1.0d, 0.0d, 1.0d, 0.0d); // 0.0
103
+ let ry: double = mat2d_vecmul_y(0.0d, -1.0d, 1.0d, 0.0d, 1.0d, 0.0d); // 1.0
104
+ ```
105
+
106
+ ## Cramer's rule
107
+
108
+ These functions solve:
109
+
110
+ ```text
111
+ [ a b ] [x] [ex]
112
+ [ c d ] [y] = [ey]
113
+ ```
114
+
115
+ | Function | Description |
116
+ |:--|:--|
117
+ | `solve2d_x(a: double, b: double, c: double, d: double, ex: double, ey: double): double` | Returns `x = (ex*d - b*ey) / det`. |
118
+ | `solve2d_y(a: double, b: double, c: double, d: double, ex: double, ey: double): double` | Returns `y = (a*ey - ex*c) / det`. |
119
+
120
+ ## Notes and caveats
121
+
122
+ - `solve2d_x` and `solve2d_y` do not guard against `det == 0`.
123
+ - Normalization uses an internal `double -> int` zero check. In practice, exact zero vectors return `0.0d`, and very small vectors whose squared length truncates to `0` are also treated as zero.
124
+ - If you need fixed-point vector math, use [`vec`](./vec.md) instead of `linalg`.
125
+ EOF
126
+
127
+ cat > "${EN_DIR}/sort.md" <<'EOF'
128
+ # `sort` — Sorting algorithms for `int[]`
129
+
130
+ Import: `import "stdlib/sort.mcrs";`
131
+
132
+ Sorting helpers for RedScript arrays. The module includes in-place insertion sort, a merge helper for two already-sorted arrays, and a coroutine-based bottom-up merge sort for larger workloads.
133
+
134
+ ## Quick example
135
+
136
+ ```rs
137
+ import "stdlib/sort.mcrs";
138
+
139
+ let data: int[] = [30, 10, 50, 20, 40];
140
+ insertion_sort(data, 5);
141
+ // data = [10, 20, 30, 40, 50]
142
+
143
+ let merged: int[] = sort_merge([1, 3, 5], 3, [2, 4, 6], 3);
144
+ // merged = [1, 2, 3, 4, 5, 6]
145
+ ```
146
+
147
+ ## Functions
148
+
149
+ ### `insertion_sort(arr: int[], len: int)`
150
+
151
+ Sorts `arr[0..len-1]` in ascending order, in place.
152
+
153
+ - Time complexity: `O(n^2)`
154
+ - Best fit: small arrays or nearly-sorted data
155
+ - Stable: yes
156
+
157
+ ### `insertion_sort_desc(arr: int[], len: int)`
158
+
159
+ Sorts `arr[0..len-1]` in descending order, in place.
160
+
161
+ - Time complexity: `O(n^2)`
162
+ - Stable: yes
163
+
164
+ ### `sort_merge(a: int[], la: int, b: int[], lb: int): int[]`
165
+
166
+ Merges two ascending sorted prefixes, `a[0..la-1]` and `b[0..lb-1]`, into a new ascending array.
167
+
168
+ - Inputs are not modified.
169
+ - Output length is `la + lb`.
170
+ - The merge is stable because equal values prefer `a[i]` first.
171
+
172
+ ### `merge_sort_coro(arr: int[], n: int)`
173
+
174
+ Coroutine-based bottom-up merge sort over `arr[0..n-1]`.
175
+
176
+ ```rs
177
+ @coroutine(batch=1, onDone=merge_sort_noop)
178
+ fn merge_sort_coro(arr: int[], n: int)
179
+ ```
180
+
181
+ Behavior:
182
+
183
+ - Sorts ascending, in place.
184
+ - Performs one full merge pass per tick.
185
+ - Uses a temporary `int[]` scratch buffer for each merged segment.
186
+ - Finishes after about `ceil(log2(n))` ticks.
187
+
188
+ This is the stdlib option for larger arrays when you want to spread the cost across ticks instead of blocking one frame with `O(n^2)` insertion sort.
189
+
190
+ ### `merge_sort_noop()`
191
+
192
+ Default `onDone` callback used by `merge_sort_coro`. Replace the decorator with your own callback if you need a completion hook.
193
+
194
+ ## Notes and caveats
195
+
196
+ - `len` and `n` control how much of the array is processed; the rest of the array is untouched.
197
+ - `sort_merge` assumes both input prefixes are already sorted ascending.
198
+ - `merge_sort_coro` mutates the original array and returns nothing.
199
+ - `@coroutine` callback selection is fixed at definition time, so customizing `onDone` usually means copying the function and changing the decorator.
200
+ EOF
201
+
202
+ cat > "${EN_DIR}/bigint.md" <<'EOF'
203
+ # `bigint` — Multi-precision integer arithmetic
204
+
205
+ Import: `import "stdlib/bigint.mcrs";`
206
+
207
+ Arbitrary-precision integer helpers built on base-10000 chunk arrays. Numbers are stored as big-endian `int[]`, where `arr[0]` is the most significant chunk and each chunk is in the range `0..9999`.
208
+
209
+ Example:
210
+
211
+ ```text
212
+ [1, 2345, 6789] = 1*10000^2 + 2345*10000 + 6789
213
+ = 100023456789
214
+ ```
215
+
216
+ ## Representation
217
+
218
+ - Base: `10000`
219
+ - Endianness: big-endian
220
+ - Chunk width: 4 decimal digits
221
+ - Typical array invariant: every chunk stays in `0..9999`
222
+
223
+ ## Core constants and chunk helpers
224
+
225
+ | Function | Description |
226
+ |:--|:--|
227
+ | `bigint_base(): int` | Returns `10000`. |
228
+ | `chunk_hi(n: int): int` | High part of a single 2-chunk split: `n / 10000`. |
229
+ | `chunk_lo(n: int): int` | Low part of a single 2-chunk split: `n % 10000`. |
230
+ | `bigint_chunk(a: int[], i: int): int` | Reads one chunk by index. |
231
+
232
+ ## 3-chunk helpers
233
+
234
+ These helpers operate on explicit `(hi, mid, lo)` values instead of arrays.
235
+
236
+ | Function | Description |
237
+ |:--|:--|
238
+ | `bigint3_add_lo(alo: int, blo: int): int` | Low chunk of `alo + blo`, modulo base. |
239
+ | `bigint3_carry_lo(alo: int, blo: int): int` | Carry from the low chunk add. |
240
+ | `bigint3_add_mid(amid: int, bmid: int, carry: int): int` | Middle chunk add with incoming carry. |
241
+ | `bigint3_carry_mid(amid: int, bmid: int, carry: int): int` | Carry from the middle chunk add. |
242
+ | `bigint3_add_hi(ahi: int, bhi: int, carry: int): int` | High chunk add with incoming carry. |
243
+ | `bigint3_sub_lo(alo: int, blo: int): int` | Low chunk subtraction with wraparound borrow. |
244
+ | `bigint3_borrow_lo(alo: int, blo: int): int` | Borrow from the low chunk subtraction. |
245
+ | `bigint3_sub_mid(amid: int, bmid: int, borrow: int): int` | Middle chunk subtraction with borrow. |
246
+ | `bigint3_borrow_mid(amid: int, bmid: int, borrow: int): int` | Borrow from the middle chunk subtraction. |
247
+ | `bigint3_sub_hi(ahi: int, bhi: int, borrow: int): int` | High chunk subtraction. |
248
+ | `bigint3_mul1_lo(a: int, b: int): int` | Low chunk of `a * b`. |
249
+ | `bigint3_mul1_hi(a: int, b: int): int` | High chunk of `a * b`. |
250
+ | `bigint3_cmp(ahi: int, amid: int, alo: int, bhi: int, bmid: int, blo: int): int` | Returns `1`, `0`, or `-1`. |
251
+ | `int32_to_bigint3_lo(n: int): int` | Low chunk of `abs(n)`. |
252
+ | `int32_to_bigint3_mid(n: int): int` | Middle chunk of `abs(n)`. |
253
+ | `int32_to_bigint3_hi(n: int): int` | High chunk of `abs(n)`. |
254
+ | `bigint3_to_int32(hi: int, mid: int, lo: int): int` | Reassembles a 3-chunk value into one `int`. |
255
+ | `bigint3_div_chunk(chunk: int, rem: int, divisor: int): int` | One-step quotient helper for division by a small integer. |
256
+ | `bigint3_rem_chunk(chunk: int, rem: int, divisor: int): int` | One-step remainder helper for division by a small integer. |
257
+
258
+ Tested example:
259
+
260
+ ```rs
261
+ let hi: int = int32_to_bigint3_hi(1023456789); // 10
262
+ let mid: int = int32_to_bigint3_mid(1023456789); // 2345
263
+ let lo: int = int32_to_bigint3_lo(1023456789); // 6789
264
+ ```
265
+
266
+ ## Array operations
267
+
268
+ | Function | Description |
269
+ |:--|:--|
270
+ | `bigint_zero(arr: int[], len: int)` | Sets the first `len` chunks to zero. |
271
+ | `bigint_copy(src: int[], dst: int[], len: int)` | Copies `len` chunks. |
272
+ | `bigint_cmp(a: int[], b: int[], len: int): int` | Lexicographic compare from most significant chunk to least. |
273
+ | `bigint_add(a: int[], b: int[], result: int[], len: int): int` | Adds two same-length bigints and returns the carry-out. |
274
+ | `bigint_sub(a: int[], b: int[], result: int[], len: int)` | Computes `a - b` with the precondition `a >= b`. |
275
+ | `bigint_mul_small(a: int[], n: int, result: int[], len: int)` | Multiplies by a small factor `n <= 9999`. |
276
+ | `bigint_shift_left(arr: int[], len: int)` | Shifts left by one chunk, equivalent to multiplying by the base and dropping overflow. |
277
+ | `bigint_is_zero(arr: int[], len: int): int` | Returns `1` if all chunks are zero. |
278
+ | `bigint_leading_zeros(arr: int[], len: int): int` | Counts leading zero chunks. |
279
+ | `bigint_div_small(a: int[], divisor: int, result: int[], len: int): int` | Divides by a small integer and returns the remainder. |
280
+ | `bigint_mod_small(a: int[], divisor: int, len: int): int` | Computes only the remainder of a small-integer division. |
281
+
282
+ ## Full multiplication and division
283
+
284
+ | Function | Description |
285
+ |:--|:--|
286
+ | `bigint_mul(a: int[], b: int[], result: int[], la: int, lb: int)` | Schoolbook `O(la*lb)` multiplication. `result` must be pre-zeroed and length `la + lb`. |
287
+ | `bigint_mul_result_len(la: int, lb: int): int` | Returns `la + lb`. |
288
+ | `bigint_sq(a: int[], result: int[], len: int)` | Squares a bigint using the diagonal/off-diagonal optimization. `result` must be pre-zeroed and length `len * 2`. |
289
+ | `bigint_shl1(a: int[], len: int): void` | Internal left-shift-by-one-chunk helper used by division. |
290
+ | `bigint_cmp_window(a: int[], aoff: int, b: int[], len: int): int` | Compares a window inside `a` to `b`. |
291
+ | `bigint_sub_window(a: int[], aoff: int, b: int[], len: int): void` | Subtracts `b` from a window inside `a`. |
292
+ | `bigint_mul_small_into(b: int[], factor: int, out: int[], len: int): void` | Writes `b * factor` into `out`. |
293
+ | `bigint_div(a: int[], b: int[], quotient: int[], remainder: int[], la: int, lb: int): void` | Long division using binary search for each quotient chunk. |
294
+
295
+ Example:
296
+
297
+ ```rs
298
+ import "stdlib/bigint.mcrs";
299
+
300
+ let a: int[] = [0, 0, 1234, 5678];
301
+ let b: int[] = [0, 0, 9999];
302
+ let result: int[] = [0, 0, 0, 0, 0, 0, 0];
303
+ bigint_mul(a, b, result, 4, 3);
304
+ ```
305
+
306
+ ## Notes and caveats
307
+
308
+ - Array APIs generally assume the caller preallocates arrays of the exact required length.
309
+ - `bigint_mul` and `bigint_sq` require the output array to be zeroed before the call.
310
+ - `bigint_div_small` and `bigint_mod_small` assume `1 <= divisor <= 9999`.
311
+ - `int32_to_bigint3_*` converts `n` with `abs(n)`, so sign is discarded.
312
+ - `bigint_div` has fixed internal temp buffers of length `16` in the current implementation. Treat that as a practical upper bound for `la` and `lb`.
313
+ - `bigint_div` does not guard against division by zero.
314
+ - `bigint_sub` is intended for `a >= b`, but the current implementation does not preserve a borrow across more than one chunk. Verify chained-borrow cases before relying on it.
315
+ EOF
316
+
317
+ cat > "${EN_DIR}/heap.md" <<'EOF'
318
+ # `heap` — Min-heap and Max-heap priority queues
319
+
320
+ Import: `import "stdlib/heap.mcrs";`
321
+
322
+ Binary heap helpers for integer priorities. The same array layout is used for both the min-heap and max-heap variants.
323
+
324
+ ## Layout
325
+
326
+ ```text
327
+ h[0] = current size
328
+ h[1..size] = heap elements
329
+ ```
330
+
331
+ - Root index: `1`
332
+ - Parent of `i`: `i / 2`
333
+ - Left child of `i`: `i * 2`
334
+ - Right child of `i`: `i * 2 + 1`
335
+ - Capacity: `64` elements total
336
+
337
+ ## Functions
338
+
339
+ | Function | Description |
340
+ |:--|:--|
341
+ | `heap_new(): int[]` | Creates a new heap array with size `0` and 64 zero-filled slots. |
342
+ | `heap_size(h: int[]): int` | Returns the number of stored elements. |
343
+ | `heap_peek(h: int[]): int` | Returns the root element. For a min-heap this is the minimum; for a max-heap it is the maximum. |
344
+ | `heap_push(h: int[], val: int): int[]` | Inserts `val` into the min-heap and restores order by sift-up. |
345
+ | `heap_pop(h: int[]): int[]` | Removes the root from the min-heap and restores order by sift-down. |
346
+ | `max_heap_push(h: int[], val: int): int[]` | Inserts `val` into the max-heap. |
347
+ | `max_heap_pop(h: int[]): int[]` | Removes the root from the max-heap. |
348
+
349
+ ## Quick examples
350
+
351
+ ### Min-heap
352
+
353
+ ```rs
354
+ import "stdlib/heap.mcrs";
355
+
356
+ let h: int[] = heap_new();
357
+ h = heap_push(h, 5);
358
+ h = heap_push(h, 1);
359
+ h = heap_push(h, 3);
360
+
361
+ let top: int = heap_peek(h); // 1
362
+ h = heap_pop(h);
363
+ let next: int = heap_peek(h); // 3
364
+ ```
365
+
366
+ ### Max-heap
367
+
368
+ ```rs
369
+ import "stdlib/heap.mcrs";
370
+
371
+ let h: int[] = heap_new();
372
+ h = max_heap_push(h, 3);
373
+ h = max_heap_push(h, 1);
374
+ h = max_heap_push(h, 5);
375
+
376
+ let top: int = heap_peek(h); // 5
377
+ h = max_heap_pop(h);
378
+ let next: int = heap_peek(h); // 3
379
+ ```
380
+
381
+ ## Notes and caveats
382
+
383
+ - `heap_peek`, `heap_pop`, and `max_heap_pop` assume the heap is non-empty.
384
+ - `heap_push` and `max_heap_push` do not check for overflow past 64 elements.
385
+ - The functions return the array so they compose cleanly with `let h: int[] = ...`, but the same underlying array is being mutated.
386
+ EOF
387
+
388
+ cat > "${ZH_DIR}/linalg.md" <<'EOF'
389
+ # `linalg` — 双精度线性代数
390
+
391
+ 导入:`import "stdlib/linalg.mcrs";`
392
+
393
+ 用于 RedScript datapack 的双精度向量与 2×2 矩阵工具。模块提供 2D/3D 点积、长度、距离、3D 叉积、2×2 行列式、矩阵乘法、矩阵乘向量,以及基于 Cramer 法则的 2×2 线性方程组求解。
394
+
395
+ **依赖:** `stdlib/math_hp.mcrs`,因为长度计算依赖 `double_sqrt`。
396
+
397
+ ## 数据表示
398
+
399
+ - 所有数值都使用原生 IEEE 754 `double`。
400
+ - 2×2 矩阵通过四个标量按行优先传入:`[a b; c d]`。
401
+ - 叉积和归一化按输出分量拆成多个函数。
402
+
403
+ ## 快速示例
404
+
405
+ ```rs
406
+ import "stdlib/linalg.mcrs";
407
+ import "stdlib/math_hp.mcrs";
408
+
409
+ let nx: double = vec3d_normalize_x(3.0d, 0.0d, 4.0d); // 0.6
410
+ let ny: double = vec3d_normalize_y(3.0d, 0.0d, 4.0d); // 0.0
411
+ let nz: double = vec3d_normalize_z(3.0d, 0.0d, 4.0d); // 0.8
412
+
413
+ let det: double = mat2d_det(2.0d, 1.0d, 1.0d, 3.0d); // 5.0
414
+ let x: double = solve2d_x(2.0d, 1.0d, 1.0d, 3.0d, 5.0d, 10.0d); // 1.0
415
+ let y: double = solve2d_y(2.0d, 1.0d, 1.0d, 3.0d, 5.0d, 10.0d); // 3.0
416
+ ```
417
+
418
+ ## 2D 向量
419
+
420
+ | 函数 | 说明 |
421
+ |:--|:--|
422
+ | `vec2d_dot(ax: double, ay: double, bx: double, by: double): double` | 点积 `ax*bx + ay*by`。 |
423
+ | `vec2d_length(x: double, y: double): double` | 欧氏长度 `sqrt(x*x + y*y)`。 |
424
+ | `vec2d_dist(ax: double, ay: double, bx: double, by: double): double` | 两个 2D 点之间的距离。 |
425
+ | `vec2d_normalize_x(x: double, y: double): double` | 单位向量的 X 分量。 |
426
+ | `vec2d_normalize_y(x: double, y: double): double` | 单位向量的 Y 分量。 |
427
+
428
+ 示例:
429
+
430
+ ```rs
431
+ let dot: double = vec2d_dot(3.0d, 4.0d, 3.0d, 4.0d); // 25.0
432
+ let len: double = vec2d_length(3.0d, 4.0d); // 5.0
433
+ let dist: double = vec2d_dist(0.0d, 0.0d, 3.0d, 4.0d); // 5.0
434
+ ```
435
+
436
+ ## 3D 向量
437
+
438
+ | 函数 | 说明 |
439
+ |:--|:--|
440
+ | `vec3d_dot(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | 点积 `ax*bx + ay*by + az*bz`。 |
441
+ | `vec3d_length(x: double, y: double, z: double): double` | 3D 欧氏长度。 |
442
+ | `vec3d_dist(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | 两个 3D 点之间的距离。 |
443
+ | `vec3d_cross_x(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | `a × b` 的 X 分量。 |
444
+ | `vec3d_cross_y(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | `a × b` 的 Y 分量。 |
445
+ | `vec3d_cross_z(ax: double, ay: double, az: double, bx: double, by: double, bz: double): double` | `a × b` 的 Z 分量。 |
446
+ | `vec3d_normalize_x(x: double, y: double, z: double): double` | 单位向量的 X 分量。 |
447
+ | `vec3d_normalize_y(x: double, y: double, z: double): double` | 单位向量的 Y 分量。 |
448
+ | `vec3d_normalize_z(x: double, y: double, z: double): double` | 单位向量的 Z 分量。 |
449
+
450
+ 示例:
451
+
452
+ ```rs
453
+ let d: double = vec3d_dot(1.0d, 2.0d, 3.0d, 4.0d, 5.0d, 6.0d); // 32.0
454
+ let cz: double = vec3d_cross_z(1.0d, 0.0d, 0.0d, 0.0d, 1.0d, 0.0d); // 1.0
455
+ ```
456
+
457
+ ## 2×2 矩阵
458
+
459
+ 矩阵布局:
460
+
461
+ ```text
462
+ [ a b ]
463
+ [ c d ]
464
+ ```
465
+
466
+ | 函数 | 说明 |
467
+ |:--|:--|
468
+ | `mat2d_det(a: double, b: double, c: double, d: double): double` | 行列式 `a*d - b*c`。 |
469
+ | `mat2d_mul_r0c0(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | `M0 × M1` 的 `[0,0]` 元素。 |
470
+ | `mat2d_mul_r0c1(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | `[0,1]` 元素。 |
471
+ | `mat2d_mul_r1c0(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | `[1,0]` 元素。 |
472
+ | `mat2d_mul_r1c1(a0: double, b0: double, c0: double, d0: double, a1: double, b1: double, c1: double, d1: double): double` | `[1,1]` 元素。 |
473
+ | `mat2d_vecmul_x(a: double, b: double, c: double, d: double, vx: double, vy: double): double` | `M × v` 的 X 分量。 |
474
+ | `mat2d_vecmul_y(a: double, b: double, c: double, d: double, vx: double, vy: double): double` | `M × v` 的 Y 分量。 |
475
+
476
+ 示例:
477
+
478
+ ```rs
479
+ let det: double = mat2d_det(1.0d, 2.0d, 3.0d, 4.0d); // -2.0
480
+ let rx: double = mat2d_vecmul_x(0.0d, -1.0d, 1.0d, 0.0d, 1.0d, 0.0d); // 0.0
481
+ let ry: double = mat2d_vecmul_y(0.0d, -1.0d, 1.0d, 0.0d, 1.0d, 0.0d); // 1.0
482
+ ```
483
+
484
+ ## Cramer 法则
485
+
486
+ 这两个函数求解:
487
+
488
+ ```text
489
+ [ a b ] [x] [ex]
490
+ [ c d ] [y] = [ey]
491
+ ```
492
+
493
+ | 函数 | 说明 |
494
+ |:--|:--|
495
+ | `solve2d_x(a: double, b: double, c: double, d: double, ex: double, ey: double): double` | 返回 `x = (ex*d - b*ey) / det`。 |
496
+ | `solve2d_y(a: double, b: double, c: double, d: double, ex: double, ey: double): double` | 返回 `y = (a*ey - ex*c) / det`。 |
497
+
498
+ ## 注意事项
499
+
500
+ - `solve2d_x` 和 `solve2d_y` 不会检查 `det == 0`。
501
+ - 归一化内部先把长度平方截断为 `int` 再做零判断,所以零向量会返回 `0.0d`,长度非常小且平方截断为 `0` 的向量也会被当作零向量。
502
+ - 如果你需要定点整数向量运算,应使用 [`vec`](./vec.md) 而不是 `linalg`。
503
+ EOF
504
+
505
+ cat > "${ZH_DIR}/sort.md" <<'EOF'
506
+ # `sort` — `int[]` 排序算法
507
+
508
+ 导入:`import "stdlib/sort.mcrs";`
509
+
510
+ 面向 RedScript 数组的排序工具。模块包含原地插入排序、用于合并两个有序数组的辅助函数,以及面向大数组的协程式自底向上归并排序。
511
+
512
+ ## 快速示例
513
+
514
+ ```rs
515
+ import "stdlib/sort.mcrs";
516
+
517
+ let data: int[] = [30, 10, 50, 20, 40];
518
+ insertion_sort(data, 5);
519
+ // data = [10, 20, 30, 40, 50]
520
+
521
+ let merged: int[] = sort_merge([1, 3, 5], 3, [2, 4, 6], 3);
522
+ // merged = [1, 2, 3, 4, 5, 6]
523
+ ```
524
+
525
+ ## 函数
526
+
527
+ ### `insertion_sort(arr: int[], len: int)`
528
+
529
+ 将 `arr[0..len-1]` 原地按升序排序。
530
+
531
+ - 时间复杂度:`O(n^2)`
532
+ - 适合:小数组或“几乎有序”的数据
533
+ - 稳定:是
534
+
535
+ ### `insertion_sort_desc(arr: int[], len: int)`
536
+
537
+ 将 `arr[0..len-1]` 原地按降序排序。
538
+
539
+ - 时间复杂度:`O(n^2)`
540
+ - 稳定:是
541
+
542
+ ### `sort_merge(a: int[], la: int, b: int[], lb: int): int[]`
543
+
544
+ 将两个升序前缀 `a[0..la-1]` 和 `b[0..lb-1]` 合并为一个新的升序数组。
545
+
546
+ - 不修改输入数组。
547
+ - 输出长度为 `la + lb`。
548
+ - 因为相等时优先取 `a[i]`,所以合并过程是稳定的。
549
+
550
+ ### `merge_sort_coro(arr: int[], n: int)`
551
+
552
+ 基于协程的自底向上归并排序,对 `arr[0..n-1]` 生效。
553
+
554
+ ```rs
555
+ @coroutine(batch=1, onDone=merge_sort_noop)
556
+ fn merge_sort_coro(arr: int[], n: int)
557
+ ```
558
+
559
+ 行为说明:
560
+
561
+ - 升序排序,原地修改。
562
+ - 每个 tick 完成一整轮 merge pass。
563
+ - 每个 merge 段都会分配一个临时 `int[]` scratch 缓冲区。
564
+ - 大约经过 `ceil(log2(n))` 个 tick 后排序完成。
565
+
566
+ 当数组较大、你不想用 `O(n^2)` 的插入排序在单 tick 内做完时,`merge_sort_coro` 是 stdlib 里的服务器友好方案。
567
+
568
+ ### `merge_sort_noop()`
569
+
570
+ `merge_sort_coro` 默认使用的 `onDone` 回调,占位用空函数。如果你需要排序完成通知,通常做法是复制该函数并改掉装饰器里的 `onDone`。
571
+
572
+ ## 注意事项
573
+
574
+ - `len` 和 `n` 决定处理多少个元素,数组剩余部分不会被改动。
575
+ - `sort_merge` 假定两个输入前缀都已经按升序排好。
576
+ - `merge_sort_coro` 会直接修改原数组,不返回新数组。
577
+ - `@coroutine` 的回调是在定义时固定的,因此想换 `onDone` 一般需要复制函数定义。
578
+ EOF
579
+
580
+ cat > "${ZH_DIR}/bigint.md" <<'EOF'
581
+ # `bigint` — 多精度整数运算
582
+
583
+ 导入:`import "stdlib/bigint.mcrs";`
584
+
585
+ 基于 base-10000 分块数组实现的任意精度整数工具。数值使用大端 `int[]` 表示,即 `arr[0]` 是最高位块,每个块都应在 `0..9999` 范围内。
586
+
587
+ 示例:
588
+
589
+ ```text
590
+ [1, 2345, 6789] = 1*10000^2 + 2345*10000 + 6789
591
+ = 100023456789
592
+ ```
593
+
594
+ ## 表示方式
595
+
596
+ - 基数:`10000`
597
+ - 端序:大端
598
+ - 每块宽度:4 位十进制数字
599
+ - 常见约束:每个块保持在 `0..9999`
600
+
601
+ ## 常量与单块辅助函数
602
+
603
+ | 函数 | 说明 |
604
+ |:--|:--|
605
+ | `bigint_base(): int` | 返回 `10000`。 |
606
+ | `chunk_hi(n: int): int` | 单个数拆成两块时的高位:`n / 10000`。 |
607
+ | `chunk_lo(n: int): int` | 单个数拆成两块时的低位:`n % 10000`。 |
608
+ | `bigint_chunk(a: int[], i: int): int` | 读取指定索引上的块。 |
609
+
610
+ ## 三块辅助函数
611
+
612
+ 这组函数直接处理 `(hi, mid, lo)`,不经过数组。
613
+
614
+ | 函数 | 说明 |
615
+ |:--|:--|
616
+ | `bigint3_add_lo(alo: int, blo: int): int` | `alo + blo` 的低块,对 base 取模。 |
617
+ | `bigint3_carry_lo(alo: int, blo: int): int` | 低块加法产生的进位。 |
618
+ | `bigint3_add_mid(amid: int, bmid: int, carry: int): int` | 带进位的中间块加法。 |
619
+ | `bigint3_carry_mid(amid: int, bmid: int, carry: int): int` | 中间块加法的进位。 |
620
+ | `bigint3_add_hi(ahi: int, bhi: int, carry: int): int` | 带进位的高块加法。 |
621
+ | `bigint3_sub_lo(alo: int, blo: int): int` | 低块减法,必要时借位回绕。 |
622
+ | `bigint3_borrow_lo(alo: int, blo: int): int` | 低块减法的借位。 |
623
+ | `bigint3_sub_mid(amid: int, bmid: int, borrow: int): int` | 带借位的中间块减法。 |
624
+ | `bigint3_borrow_mid(amid: int, bmid: int, borrow: int): int` | 中间块减法的借位。 |
625
+ | `bigint3_sub_hi(ahi: int, bhi: int, borrow: int): int` | 高块减法。 |
626
+ | `bigint3_mul1_lo(a: int, b: int): int` | `a * b` 的低块。 |
627
+ | `bigint3_mul1_hi(a: int, b: int): int` | `a * b` 的高块。 |
628
+ | `bigint3_cmp(ahi: int, amid: int, alo: int, bhi: int, bmid: int, blo: int): int` | 返回 `1`、`0` 或 `-1`。 |
629
+ | `int32_to_bigint3_lo(n: int): int` | `abs(n)` 的低块。 |
630
+ | `int32_to_bigint3_mid(n: int): int` | `abs(n)` 的中间块。 |
631
+ | `int32_to_bigint3_hi(n: int): int` | `abs(n)` 的高块。 |
632
+ | `bigint3_to_int32(hi: int, mid: int, lo: int): int` | 把三块重新拼成一个 `int`。 |
633
+ | `bigint3_div_chunk(chunk: int, rem: int, divisor: int): int` | 小整数除法中的单步商辅助函数。 |
634
+ | `bigint3_rem_chunk(chunk: int, rem: int, divisor: int): int` | 小整数除法中的单步余数辅助函数。 |
635
+
636
+ 已测试示例:
637
+
638
+ ```rs
639
+ let hi: int = int32_to_bigint3_hi(1023456789); // 10
640
+ let mid: int = int32_to_bigint3_mid(1023456789); // 2345
641
+ let lo: int = int32_to_bigint3_lo(1023456789); // 6789
642
+ ```
643
+
644
+ ## 数组运算
645
+
646
+ | 函数 | 说明 |
647
+ |:--|:--|
648
+ | `bigint_zero(arr: int[], len: int)` | 将前 `len` 个块清零。 |
649
+ | `bigint_copy(src: int[], dst: int[], len: int)` | 复制 `len` 个块。 |
650
+ | `bigint_cmp(a: int[], b: int[], len: int): int` | 从高位到低位做字典序比较。 |
651
+ | `bigint_add(a: int[], b: int[], result: int[], len: int): int` | 两个同长度整数相加,返回最终进位。 |
652
+ | `bigint_sub(a: int[], b: int[], result: int[], len: int)` | 计算 `a - b`,前提是 `a >= b`。 |
653
+ | `bigint_mul_small(a: int[], n: int, result: int[], len: int)` | 乘以小整数 `n <= 9999`。 |
654
+ | `bigint_shift_left(arr: int[], len: int)` | 整体左移一块,相当于乘以 base 并丢弃最高位溢出。 |
655
+ | `bigint_is_zero(arr: int[], len: int): int` | 全零时返回 `1`。 |
656
+ | `bigint_leading_zeros(arr: int[], len: int): int` | 统计前导零块数量。 |
657
+ | `bigint_div_small(a: int[], divisor: int, result: int[], len: int): int` | 除以小整数并返回余数。 |
658
+ | `bigint_mod_small(a: int[], divisor: int, len: int): int` | 只计算小整数除法的余数。 |
659
+
660
+ ## 完整乘法与除法
661
+
662
+ | 函数 | 说明 |
663
+ |:--|:--|
664
+ | `bigint_mul(a: int[], b: int[], result: int[], la: int, lb: int)` | 学校式 `O(la*lb)` 乘法。`result` 需要预先清零,长度为 `la + lb`。 |
665
+ | `bigint_mul_result_len(la: int, lb: int): int` | 返回 `la + lb`。 |
666
+ | `bigint_sq(a: int[], result: int[], len: int)` | 平方优化版乘法。`result` 需要预先清零,长度为 `len * 2`。 |
667
+ | `bigint_shl1(a: int[], len: int): void` | 供除法使用的内部左移一块辅助函数。 |
668
+ | `bigint_cmp_window(a: int[], aoff: int, b: int[], len: int): int` | 比较 `a` 的一个窗口与 `b`。 |
669
+ | `bigint_sub_window(a: int[], aoff: int, b: int[], len: int): void` | 在 `a` 的窗口上原地减去 `b`。 |
670
+ | `bigint_mul_small_into(b: int[], factor: int, out: int[], len: int): void` | 将 `b * factor` 写入 `out`。 |
671
+ | `bigint_div(a: int[], b: int[], quotient: int[], remainder: int[], la: int, lb: int): void` | 每一位商用二分搜索试商的长除法实现。 |
672
+
673
+ 示例:
674
+
675
+ ```rs
676
+ import "stdlib/bigint.mcrs";
677
+
678
+ let a: int[] = [0, 0, 1234, 5678];
679
+ let b: int[] = [0, 0, 9999];
680
+ let result: int[] = [0, 0, 0, 0, 0, 0, 0];
681
+ bigint_mul(a, b, result, 4, 3);
682
+ ```
683
+
684
+ ## 注意事项
685
+
686
+ - 数组 API 通常要求调用方先按正确长度分配好输出数组。
687
+ - `bigint_mul` 和 `bigint_sq` 要求输出数组在调用前已经清零。
688
+ - `bigint_div_small` 和 `bigint_mod_small` 假定 `1 <= divisor <= 9999`。
689
+ - `int32_to_bigint3_*` 会先取 `abs(n)`,因此符号会丢失。
690
+ - 当前实现中的 `bigint_div` 内部临时数组长度固定为 `16`,因此 `la`、`lb` 实际上应视为不超过 16。
691
+ - `bigint_div` 不会检查除数是否为零。
692
+ - `bigint_sub` 的目标语义是处理 `a >= b`,但当前实现不能跨多个块持续保留 borrow;遇到连续借位场景时,使用前应先验证。
693
+ EOF
694
+
695
+ cat > "${ZH_DIR}/heap.md" <<'EOF'
696
+ # `heap` — 小根堆与大根堆优先队列
697
+
698
+ 导入:`import "stdlib/heap.mcrs";`
699
+
700
+ 面向整数优先级的二叉堆工具。小根堆和大根堆共享同一种数组布局。
701
+
702
+ ## 布局
703
+
704
+ ```text
705
+ h[0] = 当前大小
706
+ h[1..size] = 堆元素
707
+ ```
708
+
709
+ - 根节点索引:`1`
710
+ - `i` 的父节点:`i / 2`
711
+ - `i` 的左孩子:`i * 2`
712
+ - `i` 的右孩子:`i * 2 + 1`
713
+ - 总容量:`64` 个元素
714
+
715
+ ## 函数
716
+
717
+ | 函数 | 说明 |
718
+ |:--|:--|
719
+ | `heap_new(): int[]` | 创建一个新堆,初始大小为 `0`,并预填 64 个零槽位。 |
720
+ | `heap_size(h: int[]): int` | 返回当前元素数量。 |
721
+ | `heap_peek(h: int[]): int` | 返回根元素。对小根堆来说是最小值,对大根堆来说是最大值。 |
722
+ | `heap_push(h: int[], val: int): int[]` | 向小根堆插入 `val`,并通过 sift-up 恢复堆序。 |
723
+ | `heap_pop(h: int[]): int[]` | 从小根堆移除根元素,并通过 sift-down 恢复堆序。 |
724
+ | `max_heap_push(h: int[], val: int): int[]` | 向大根堆插入 `val`。 |
725
+ | `max_heap_pop(h: int[]): int[]` | 从大根堆移除根元素。 |
726
+
727
+ ## 快速示例
728
+
729
+ ### 小根堆
730
+
731
+ ```rs
732
+ import "stdlib/heap.mcrs";
733
+
734
+ let h: int[] = heap_new();
735
+ h = heap_push(h, 5);
736
+ h = heap_push(h, 1);
737
+ h = heap_push(h, 3);
738
+
739
+ let top: int = heap_peek(h); // 1
740
+ h = heap_pop(h);
741
+ let next: int = heap_peek(h); // 3
742
+ ```
743
+
744
+ ### 大根堆
745
+
746
+ ```rs
747
+ import "stdlib/heap.mcrs";
748
+
749
+ let h: int[] = heap_new();
750
+ h = max_heap_push(h, 3);
751
+ h = max_heap_push(h, 1);
752
+ h = max_heap_push(h, 5);
753
+
754
+ let top: int = heap_peek(h); // 5
755
+ h = max_heap_pop(h);
756
+ let next: int = heap_peek(h); // 3
757
+ ```
758
+
759
+ ## 注意事项
760
+
761
+ - `heap_peek`、`heap_pop` 和 `max_heap_pop` 都假定堆非空。
762
+ - `heap_push` 与 `max_heap_push` 都不会检查是否超过 64 个元素。
763
+ - 这些函数虽然返回数组,便于写成 `h = heap_push(h, x)`,但底层修改的仍是同一个数组。
764
+ EOF
765
+
766
+ cd "${DOCS_ROOT}"
767
+ git add -A
768
+ git commit -S -m "docs(stdlib): linalg/sort/bigint/heap modules"
769
+ git push
770
+ openclaw system event --text "Done: linalg/sort/bigint/heap docs" --mode now