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
@@ -19,6 +19,9 @@ module library;
19
19
 
20
20
  // ─── Constants ───────────────────────────────────────────────────────────────
21
21
 
22
+ /// Return the bigint base (10000 = base-10000, each chunk holds 4 decimal digits).
23
+ /// @since 1.0.0
24
+ /// @returns 10000
22
25
  fn bigint_base(): int { return 10000; }
23
26
 
24
27
  // ─── Single-chunk helpers ────────────────────────────────────────────────────
@@ -96,20 +99,37 @@ fn bigint3_rem_chunk(chunk: int, rem: int, divisor: int): int {
96
99
 
97
100
  // ─── Arbitrary-length operations (array by-ref, RedScript ≥ 2.4.0) ──────────
98
101
 
99
- // bigint_zero(arr, len): set all chunks to 0
102
+ /// Set all chunks of a bigint array to zero.
103
+ /// @since 1.0.0
104
+ /// @param arr BigInt array (most-significant chunk at index 0)
105
+ /// @param len Number of chunks
106
+ /// @returns void — arr[0..len-1] set to 0
107
+ /// @example
108
+ /// bigint_zero(result, 4) // zero out a 4-chunk bigint
100
109
  fn bigint_zero(arr: int[], len: int) {
101
110
  let i: int = 0;
102
111
  while (i < len) { arr[i] = 0; i = i + 1; }
103
112
  }
104
113
 
105
- // bigint_copy(src, dst, len): copy src into dst
114
+ /// Copy a bigint from src into dst.
115
+ /// @since 1.0.0
116
+ /// @param src Source bigint array
117
+ /// @param dst Destination bigint array (must have length >= len)
118
+ /// @param len Number of chunks to copy
119
+ /// @returns void — dst[0..len-1] = src[0..len-1]
106
120
  fn bigint_copy(src: int[], dst: int[], len: int) {
107
121
  let i: int = 0;
108
122
  while (i < len) { dst[i] = src[i]; i = i + 1; }
109
123
  }
110
124
 
111
- // bigint_cmp(a, b, len): compare a and b, returns 1 if a>b, -1 if a<b, 0 if equal
112
- // Most significant chunk is at index 0 (big-endian)
125
+ /// Compare two bigints of equal length.
126
+ /// @since 1.0.0
127
+ /// @param a First bigint (most-significant chunk at index 0)
128
+ /// @param b Second bigint
129
+ /// @param len Number of chunks (must be equal for both)
130
+ /// @returns 1 if a > b, -1 if a < b, 0 if equal
131
+ /// @example
132
+ /// let cmp: int = bigint_cmp(a, b, 4)
113
133
  fn bigint_cmp(a: int[], b: int[], len: int): int {
114
134
  let i: int = 0;
115
135
  while (i < len) {
@@ -120,8 +140,15 @@ fn bigint_cmp(a: int[], b: int[], len: int): int {
120
140
  return 0;
121
141
  }
122
142
 
123
- // bigint_add(a, b, result, len): result = a + b (in-place into result array)
124
- // Returns carry out (0 or 1) — caller should handle overflow
143
+ /// Add two bigints of equal length, writing result into a pre-allocated array.
144
+ /// @since 1.0.0
145
+ /// @param a First bigint addend
146
+ /// @param b Second bigint addend
147
+ /// @param result Output bigint array (must have length >= len, may alias a or b)
148
+ /// @param len Number of chunks
149
+ /// @returns Carry out: 0 or 1 (overflow if non-zero)
150
+ /// @example
151
+ /// let carry: int = bigint_add(a, b, result, 4)
125
152
  fn bigint_add(a: int[], b: int[], result: int[], len: int): int {
126
153
  let carry: int = 0;
127
154
  let i: int = len - 1; // start from least significant (rightmost)
@@ -134,7 +161,13 @@ fn bigint_add(a: int[], b: int[], result: int[], len: int): int {
134
161
  return carry;
135
162
  }
136
163
 
137
- // bigint_sub(a, b, result, len): result = a - b (assumes a >= b)
164
+ /// Subtract bigint b from a, writing result (assumes a >= b, no underflow check).
165
+ /// @since 1.0.0
166
+ /// @param a Minuend bigint
167
+ /// @param b Subtrahend bigint (must be <= a)
168
+ /// @param result Output bigint array
169
+ /// @param len Number of chunks
170
+ /// @returns void — result = a - b
138
171
  fn bigint_sub(a: int[], b: int[], result: int[], len: int) {
139
172
  let borrow: int = 0;
140
173
  let i: int = len - 1;
@@ -150,7 +183,15 @@ fn bigint_sub(a: int[], b: int[], result: int[], len: int) {
150
183
  }
151
184
  }
152
185
 
153
- // bigint_mul_small(a, n, result, len): result = a × n, where n ≤ 9999
186
+ /// Multiply a bigint by a small integer (1 n ≤ 9999).
187
+ /// @since 1.0.0
188
+ /// @param a Bigint multiplicand
189
+ /// @param n Small integer multiplier (must be in [1, 9999] to avoid overflow)
190
+ /// @param result Output bigint array (must have length >= len)
191
+ /// @param len Number of chunks
192
+ /// @returns void — result = a * n; high overflow is silently lost
193
+ /// @example
194
+ /// bigint_mul_small(a, 1000, result, 4) // result = a × 1000
154
195
  fn bigint_mul_small(a: int[], n: int, result: int[], len: int) {
155
196
  let carry: int = 0;
156
197
  let i: int = len - 1;
@@ -201,8 +242,15 @@ fn bigint_leading_zeros(arr: int[], len: int): int {
201
242
  // result[i] = (rem*10000 + a[i]) / divisor
202
243
  // rem = (rem*10000 + a[i]) % divisor
203
244
 
204
- // bigint_div_small(a, divisor, result, len): result = a / divisor
205
- // Returns remainder.
245
+ /// Divide a bigint by a small integer (1 ≤ divisor 9999), returning quotient and remainder.
246
+ /// @since 1.0.0
247
+ /// @param a Dividend bigint
248
+ /// @param divisor Small integer divisor (range [1, 9999])
249
+ /// @param result Output quotient bigint array
250
+ /// @param len Number of chunks
251
+ /// @returns Remainder (0..divisor-1)
252
+ /// @example
253
+ /// let rem: int = bigint_div_small(a, 7, result, 4)
206
254
  fn bigint_div_small(a: int[], divisor: int, result: int[], len: int): int {
207
255
  let rem: int = 0;
208
256
  let i: int = 0;
@@ -215,7 +263,14 @@ fn bigint_div_small(a: int[], divisor: int, result: int[], len: int): int {
215
263
  return rem;
216
264
  }
217
265
 
218
- // bigint_mod_small(a, divisor, len): return a % divisor (0..divisor-1)
266
+ /// Compute a bigint modulo a small integer without allocating a quotient array.
267
+ /// @since 1.0.0
268
+ /// @param a Dividend bigint
269
+ /// @param divisor Small integer divisor (range [1, 9999])
270
+ /// @param len Number of chunks
271
+ /// @returns a % divisor, in [0, divisor-1]
272
+ /// @example
273
+ /// let mod: int = bigint_mod_small(a, 10, 4) // last decimal digit of a
219
274
  fn bigint_mod_small(a: int[], divisor: int, len: int): int {
220
275
  let rem: int = 0;
221
276
  let i: int = 0;
@@ -248,6 +303,17 @@ fn bigint_chunk(a: int[], i: int): int {
248
303
  // let result: int[] = [0, 0, 0, 0, 0, 0, 0]; // la+lb = 7 chunks, pre-zeroed
249
304
  // bigint_mul(a, b, result, 4, 3);
250
305
  //
306
+ /// Multiply two bigints using schoolbook O(n²) algorithm.
307
+ /// @since 1.0.0
308
+ /// @param a First bigint (la chunks)
309
+ /// @param b Second bigint (lb chunks)
310
+ /// @param result Output bigint array (must have la+lb chunks, pre-zeroed)
311
+ /// @param la Number of chunks in a
312
+ /// @param lb Number of chunks in b
313
+ /// @returns void — result = a * b; result must not alias a or b
314
+ /// @example
315
+ /// let result: int[] = [0, 0, 0, 0, 0, 0, 0]
316
+ /// bigint_mul(a, b, result, 4, 3)
251
317
  fn bigint_mul(a: int[], b: int[], result: int[], la: int, lb: int) {
252
318
  // Phase 1: accumulate partial products (big-endian, MSB at index 0)
253
319
  // a[i] is the (la-1-i)-th digit from LSB, similarly for b[j]
@@ -286,6 +352,15 @@ fn bigint_mul_result_len(la: int, lb: int): int {
286
352
  // result must have len*2 chunks (pre-zeroed).
287
353
  // Optimized: only compute upper triangle and double (avoids redundant multiplications).
288
354
  //
355
+ /// Square a bigint (optimized: computes upper triangle only).
356
+ /// @since 1.0.0
357
+ /// @param a Bigint to square (len chunks)
358
+ /// @param result Output bigint array (must have len*2 chunks, pre-zeroed)
359
+ /// @param len Number of chunks in a
360
+ /// @returns void — result = a * a
361
+ /// @example
362
+ /// let sq: int[] = [0, 0, 0, 0, 0, 0, 0, 0]
363
+ /// bigint_sq(a, sq, 4) // sq = a²
289
364
  fn bigint_sq(a: int[], result: int[], len: int) {
290
365
  // Diagonal terms (i == j)
291
366
  let i: int = 0;
@@ -392,6 +467,17 @@ fn bigint_mul_small_into(b: int[], factor: int, out: int[], len: int): void {
392
467
  // quotient[0..la-1] is written, remainder[0..lb-1] is written.
393
468
  // a and b must not alias quotient or remainder.
394
469
  // NOTE: la >= lb required; both arrays most-significant first, base 10000.
470
+ /// Full arbitrary-precision integer division: a / b → quotient and remainder.
471
+ /// @since 1.0.0
472
+ /// @param a Dividend bigint (la chunks)
473
+ /// @param b Divisor bigint (lb chunks)
474
+ /// @param quotient Output quotient array (la chunks, pre-zeroed)
475
+ /// @param remainder Output remainder array (lb chunks, pre-zeroed)
476
+ /// @param la Number of chunks in a (must be >= lb)
477
+ /// @param lb Number of chunks in b
478
+ /// @returns void — quotient = a/b, remainder = a%b; a and b must not alias outputs
479
+ /// @example
480
+ /// bigint_div(a, b, quotient, remainder, 4, 2)
395
481
  fn bigint_div(a: int[], b: int[], quotient: int[], remainder: int[], la: int, lb: int): void {
396
482
  // Work on a copy of a (dividend) to allow in-place subtraction
397
483
  let work: int[] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
@@ -16,7 +16,13 @@ module library;
16
16
 
17
17
  // ─── Core: single-bit operations ─────────────────────────────────────────────
18
18
 
19
- // bit_get(x, n): return 1 if bit n is set, 0 otherwise. n ∈ [0, 30]
19
+ /// Test whether bit n of x is set.
20
+ /// @since 1.0.0
21
+ /// @param x Integer value to test
22
+ /// @param n Bit index (0 = least significant), range [0, 30]
23
+ /// @returns 1 if bit n is set, 0 otherwise
24
+ /// @example
25
+ /// let b: int = bit_get(0b1010, 1) // result: 1 (bit 1 of 10 is set)
20
26
  fn bit_get(x: int, n: int): int {
21
27
  let mask: int = 1;
22
28
  let i: int = 0;
@@ -24,7 +30,13 @@ fn bit_get(x: int, n: int): int {
24
30
  return (x / mask) % 2;
25
31
  }
26
32
 
27
- // bit_set(x, n): set bit n to 1. n [0, 30]
33
+ /// Set bit n of x to 1 (idempotent if already set).
34
+ /// @since 1.0.0
35
+ /// @param x Integer value to modify
36
+ /// @param n Bit index to set, range [0, 30]
37
+ /// @returns x with bit n set to 1
38
+ /// @example
39
+ /// let v: int = bit_set(0b0100, 0) // result: 0b0101 = 5
28
40
  fn bit_set(x: int, n: int): int {
29
41
  let mask: int = 1;
30
42
  let i: int = 0;
@@ -33,7 +45,13 @@ fn bit_set(x: int, n: int): int {
33
45
  return x;
34
46
  }
35
47
 
36
- // bit_clear(x, n): clear bit n to 0. n [0, 30]
48
+ /// Clear bit n of x to 0 (idempotent if already clear).
49
+ /// @since 1.0.0
50
+ /// @param x Integer value to modify
51
+ /// @param n Bit index to clear, range [0, 30]
52
+ /// @returns x with bit n set to 0
53
+ /// @example
54
+ /// let v: int = bit_clear(0b0111, 1) // result: 0b0101 = 5
37
55
  fn bit_clear(x: int, n: int): int {
38
56
  let mask: int = 1;
39
57
  let i: int = 0;
@@ -42,7 +60,13 @@ fn bit_clear(x: int, n: int): int {
42
60
  return x;
43
61
  }
44
62
 
45
- // bit_toggle(x, n): toggle bit n. n [0, 30]
63
+ /// Toggle bit n of x (flip 0→1 or 1→0).
64
+ /// @since 1.0.0
65
+ /// @param x Integer value to modify
66
+ /// @param n Bit index to toggle, range [0, 30]
67
+ /// @returns x with bit n flipped
68
+ /// @example
69
+ /// let v: int = bit_toggle(0b0101, 1) // result: 0b0111 = 7
46
70
  fn bit_toggle(x: int, n: int): int {
47
71
  let mask: int = 1;
48
72
  let i: int = 0;
@@ -53,7 +77,13 @@ fn bit_toggle(x: int, n: int): int {
53
77
 
54
78
  // ─── Shift operations ────────────────────────────────────────────────────────
55
79
 
56
- // bit_shl(x, n): left shift x by n bits (x << n). n ∈ [0, 30]
80
+ /// Left-shift x by n bits (equivalent to x * 2^n).
81
+ /// @since 1.0.0
82
+ /// @param x Integer to shift
83
+ /// @param n Number of bit positions to shift left, range [0, 30]
84
+ /// @returns x << n
85
+ /// @example
86
+ /// let v: int = bit_shl(1, 4) // result: 16 (1 << 4)
57
87
  fn bit_shl(x: int, n: int): int {
58
88
  let result: int = x;
59
89
  let i: int = 0;
@@ -61,8 +91,13 @@ fn bit_shl(x: int, n: int): int {
61
91
  return result;
62
92
  }
63
93
 
64
- // bit_shr(x, n): logical right shift x by n bits (x >> n). n [0, 30]
65
- // Note: divides by 2^n, truncating toward zero.
94
+ /// Logical right-shift x by n bits (equivalent to x / 2^n, truncating toward zero).
95
+ /// @since 1.0.0
96
+ /// @param x Integer to shift
97
+ /// @param n Number of bit positions to shift right, range [0, 30]
98
+ /// @returns x >> n (logical, not arithmetic for positive values)
99
+ /// @example
100
+ /// let v: int = bit_shr(256, 3) // result: 32 (256 >> 3)
66
101
  fn bit_shr(x: int, n: int): int {
67
102
  let result: int = x;
68
103
  let i: int = 0;
@@ -73,7 +108,13 @@ fn bit_shr(x: int, n: int): int {
73
108
  // ─── Bitwise AND / OR / XOR ──────────────────────────────────────────────────
74
109
  // These iterate over 31 bits (signed int32, bit 31 is sign).
75
110
 
76
- // bit_and(a, b): bitwise AND
111
+ /// Bitwise AND of two integers (all 31 non-sign bits).
112
+ /// @since 1.0.0
113
+ /// @param a First operand
114
+ /// @param b Second operand
115
+ /// @returns a & b (bits set in both a and b)
116
+ /// @example
117
+ /// let v: int = bit_and(0b1100, 0b1010) // result: 0b1000 = 8
77
118
  fn bit_and(a: int, b: int): int {
78
119
  let result: int = 0;
79
120
  let mask: int = 1;
@@ -90,7 +131,13 @@ fn bit_and(a: int, b: int): int {
90
131
  return result;
91
132
  }
92
133
 
93
- // bit_or(a, b): bitwise OR
134
+ /// Bitwise OR of two integers (all 31 non-sign bits).
135
+ /// @since 1.0.0
136
+ /// @param a First operand
137
+ /// @param b Second operand
138
+ /// @returns a | b (bits set in either a or b)
139
+ /// @example
140
+ /// let v: int = bit_or(0b1100, 0b1010) // result: 0b1110 = 14
94
141
  fn bit_or(a: int, b: int): int {
95
142
  let result: int = 0;
96
143
  let mask: int = 1;
@@ -110,7 +157,13 @@ fn bit_or(a: int, b: int): int {
110
157
  return result;
111
158
  }
112
159
 
113
- // bit_xor(a, b): bitwise XOR
160
+ /// Bitwise XOR of two integers (all 31 non-sign bits).
161
+ /// @since 1.0.0
162
+ /// @param a First operand
163
+ /// @param b Second operand
164
+ /// @returns a ^ b (bits set in exactly one of a or b)
165
+ /// @example
166
+ /// let v: int = bit_xor(0b1100, 0b1010) // result: 0b0110 = 6
114
167
  fn bit_xor(a: int, b: int): int {
115
168
  let result: int = 0;
116
169
  let mask: int = 1;
@@ -127,7 +180,12 @@ fn bit_xor(a: int, b: int): int {
127
180
  return result;
128
181
  }
129
182
 
130
- // bit_not(x): bitwise NOT (inverts all 31 bits, sign bit excluded)
183
+ /// Bitwise NOT inverts all 31 non-sign bits of x.
184
+ /// @since 1.0.0
185
+ /// @param x Integer to invert
186
+ /// @returns ~x (all 31 lower bits flipped; sign bit excluded)
187
+ /// @example
188
+ /// let v: int = bit_not(0) // result: 2147483647 (all 31 bits set)
131
189
  fn bit_not(x: int): int {
132
190
  let result: int = 0;
133
191
  let mask: int = 1;
@@ -144,7 +202,12 @@ fn bit_not(x: int): int {
144
202
 
145
203
  // ─── Popcount ────────────────────────────────────────────────────────────────
146
204
 
147
- // popcount(x): count number of set bits (0-31)
205
+ /// Count the number of set bits in x (population count / Hamming weight).
206
+ /// @since 1.0.0
207
+ /// @param x Integer value (uses 31 lower bits; sign bit excluded)
208
+ /// @returns Number of bits set to 1, in [0, 31]
209
+ /// @example
210
+ /// let n: int = popcount(255) // result: 8 (0xFF has 8 bits set)
148
211
  fn popcount(x: int): int {
149
212
  let count: int = 0;
150
213
  let v: int = x;
@@ -1,7 +1,14 @@
1
1
  // Bossbar helpers for progress bars and timers
2
2
  // Usage: import "stdlib/bossbar.mcrs"
3
3
 
4
- /// Create and show a timer bossbar
4
+ /// Creates a visible timer bossbar for all players.
5
+ /// The bossbar max and current value are initialized to `max_seconds * 20`
6
+ /// so callers can update it directly in game ticks.
7
+ /// @param id Bossbar identifier, usually `<namespace>:<name>`
8
+ /// @param name Display name shown on the bossbar
9
+ /// @param max_seconds Duration in seconds; converted to ticks internally
10
+ /// @example
11
+ /// create_timer_bar("game:round", "Round Timer", 90)
5
12
  fn create_timer_bar(id: string, name: string, max_seconds: int) {
6
13
  bossbar_add(id, name);
7
14
  bossbar_set_max(id, max_seconds * 20);
@@ -12,7 +19,13 @@ fn create_timer_bar(id: string, name: string, max_seconds: int) {
12
19
  bossbar_set_visible(id, 1);
13
20
  }
14
21
 
15
- /// Create a health-style bossbar (red)
22
+ /// Creates a visible red bossbar initialized at full value.
23
+ /// Useful for boss HP or shared health objectives.
24
+ /// @param id Bossbar identifier, usually `<namespace>:<name>`
25
+ /// @param name Display name shown on the bossbar
26
+ /// @param max_val Maximum value and initial value of the bar
27
+ /// @example
28
+ /// create_health_bar("raid:boss_hp", "Warden", 500)
16
29
  fn create_health_bar(id: string, name: string, max_val: int) {
17
30
  bossbar_add(id, name);
18
31
  bossbar_set_max(id, max_val);
@@ -23,7 +36,13 @@ fn create_health_bar(id: string, name: string, max_val: int) {
23
36
  bossbar_set_visible(id, 1);
24
37
  }
25
38
 
26
- /// Create a progress bossbar (blue)
39
+ /// Creates a visible blue progress bossbar starting at zero.
40
+ /// Useful for charge bars, capture progress, or phase tracking.
41
+ /// @param id Bossbar identifier, usually `<namespace>:<name>`
42
+ /// @param name Display name shown on the bossbar
43
+ /// @param max_val Maximum progress value
44
+ /// @example
45
+ /// create_progress_bar("game:capture", "Capture", 100)
27
46
  fn create_progress_bar(id: string, name: string, max_val: int) {
28
47
  bossbar_add(id, name);
29
48
  bossbar_set_max(id, max_val);
@@ -34,27 +53,37 @@ fn create_progress_bar(id: string, name: string, max_val: int) {
34
53
  bossbar_set_visible(id, 1);
35
54
  }
36
55
 
37
- /// Update bossbar value
56
+ /// Sets the current value of an existing bossbar.
57
+ /// RedScript does not clamp the value; Minecraft handles display behavior.
58
+ /// @param id Bossbar identifier
59
+ /// @param value New current value
38
60
  fn update_bar(id: string, value: int) {
39
61
  bossbar_set_value(id, value);
40
62
  }
41
63
 
42
- /// Hide bossbar
64
+ /// Hides an existing bossbar from all assigned players.
65
+ /// @param id Bossbar identifier
43
66
  fn hide_bar(id: string) {
44
67
  bossbar_set_visible(id, 0);
45
68
  }
46
69
 
47
- /// Show bossbar
70
+ /// Shows an existing bossbar to all assigned players.
71
+ /// @param id Bossbar identifier
48
72
  fn show_bar(id: string) {
49
73
  bossbar_set_visible(id, 1);
50
74
  }
51
75
 
52
- /// Remove bossbar
76
+ /// Removes an existing bossbar entirely.
77
+ /// After removal, the same `id` must be recreated before reuse.
78
+ /// @param id Bossbar identifier
53
79
  fn remove_bar(id: string) {
54
80
  bossbar_remove(id);
55
81
  }
56
82
 
57
- /// Set bossbar color based on percentage
83
+ /// Updates the bossbar color from a percentage threshold.
84
+ /// Values above 66 use green, above 33 use yellow, otherwise red.
85
+ /// @param id Bossbar identifier
86
+ /// @param percent Percentage in the expected 0-100 range
58
87
  fn update_bar_color(id: string, percent: int) {
59
88
  if (percent > 66) {
60
89
  bossbar_set_color(id, "green");
@@ -12,24 +12,35 @@ module library;
12
12
 
13
13
  // ─── Differentiation ─────────────────────────────────────────────────────────
14
14
 
15
- // deriv_forward(f1, f0, h_fx): forward difference derivative
16
- // f1 = f(x+h), f0 = f(x), h_fx = step size ×10000
17
- // Returns df/dx ×10000
15
+ /// Forward-difference derivative: (f(x+h) f(x)) / h.
16
+ /// @since 1.3.0
17
+ /// @param f1 f(x + h) × 10000
18
+ /// @param f0 f(x) × 10000
19
+ /// @param h_fx Step size × 10000 (must not be zero)
20
+ /// @returns df/dx × 10000; returns 0 if h_fx == 0
18
21
  fn deriv_forward(f1: int, f0: int, h_fx: int): int {
19
22
  if (h_fx == 0) { return 0; }
20
23
  return (f1 - f0) * 10000 / h_fx;
21
24
  }
22
25
 
23
- // deriv_central(f_plus, f_minus, h_fx): central difference (more accurate)
24
- // f_plus = f(x+h), f_minus = f(x-h)
25
- // Returns df/dx ×10000
26
+ /// Central-difference derivative: (f(x+h) f(x−h)) / (2h). More accurate than forward difference.
27
+ /// @since 1.3.0
28
+ /// @param f_plus f(x + h) × 10000
29
+ /// @param f_minus f(x − h) × 10000
30
+ /// @param h_fx Step size × 10000 (must not be zero)
31
+ /// @returns df/dx × 10000; returns 0 if h_fx == 0
26
32
  fn deriv_central(f_plus: int, f_minus: int, h_fx: int): int {
27
33
  if (h_fx == 0) { return 0; }
28
34
  return (f_plus - f_minus) * 10000 / (2 * h_fx);
29
35
  }
30
36
 
31
- // second_deriv(f_plus, f0, f_minus, h_fx): second derivative
32
- // Returns d²f/dx² ×10000
37
+ /// Second derivative via the central finite-difference formula: (f(x+h) 2f(x) + f(x−h)) / h².
38
+ /// @since 1.3.0
39
+ /// @param f_plus f(x + h) × 10000
40
+ /// @param f0 f(x) × 10000
41
+ /// @param f_minus f(x − h) × 10000
42
+ /// @param h_fx Step size × 10000 (must not be zero)
43
+ /// @returns d²f/dx² × 10000; returns 0 if h_fx == 0
33
44
  fn second_deriv(f_plus: int, f0: int, f_minus: int, h_fx: int): int {
34
45
  if (h_fx == 0) { return 0; }
35
46
  return (f_plus - 2 * f0 + f_minus) * 100000000 / h_fx / h_fx;
@@ -40,10 +51,15 @@ fn second_deriv(f_plus: int, f0: int, f_minus: int, h_fx: int): int {
40
51
  // For integration, the user provides an array of function values at equally
41
52
  // spaced points, and the step size.
42
53
 
43
- // integrate_trapezoid(vals, n, h_fx): trapezoidal rule integration
44
- // vals: array of n function values ×10000, equally spaced by h_fx
45
- // h_fx: step width ×10000
46
- // Returns integral ×10000 (area under curve)
54
+ /// Numerical integration using the trapezoidal rule.
55
+ /// @since 1.3.0
56
+ /// @param vals Array of n function values × 10000 at equally spaced points
57
+ /// @param n Number of sample points (must be ≥ 2)
58
+ /// @param h_fx Step width between samples × 10000
59
+ /// @returns Approximate integral × 10000 (area under the curve)
60
+ /// @example
61
+ /// let ys: int[] = [0, 5000, 10000]; // f(0)=0, f(0.5)=0.5, f(1)=1 (linear)
62
+ /// let area: int = integrate_trapezoid(ys, 3, 5000); // ≈ 5000 (∫₀¹ x dx = 0.5)
47
63
  fn integrate_trapezoid(vals: int[], n: int, h_fx: int): int {
48
64
  if (n < 2) { return 0; }
49
65
  // Sum = (vals[0] + vals[n-1]) / 2 + vals[1] + vals[2] + ... + vals[n-2]
@@ -56,8 +72,13 @@ fn integrate_trapezoid(vals: int[], n: int, h_fx: int): int {
56
72
  return sum * h_fx / 10000;
57
73
  }
58
74
 
59
- // integrate_simpson(vals, n, h_fx): Simpson's 1/3 rule (n must be odd, n 3)
60
- // More accurate than trapezoid for smooth functions
75
+ /// Numerical integration using Simpson's 1/3 rule (more accurate than trapezoid for smooth functions).
76
+ /// Uses n−1 intervals if n is even. Requires n ≥ 3.
77
+ /// @since 1.3.0
78
+ /// @param vals Array of n function values × 10000 at equally spaced points
79
+ /// @param n Number of sample points (should be odd and ≥ 3)
80
+ /// @param h_fx Step width × 10000
81
+ /// @returns Approximate integral × 10000
61
82
  fn integrate_simpson(vals: int[], n: int, h_fx: int): int {
62
83
  if (n < 3) { return integrate_trapezoid(vals, n, h_fx); }
63
84
  // Ensure n is odd by using n-1 if even
@@ -80,7 +101,12 @@ fn integrate_simpson(vals: int[], n: int, h_fx: int): int {
80
101
 
81
102
  // ─── Riemann sums ─────────────────────────────────────────────────────────────
82
103
 
83
- // riemann_left(vals, n, h_fx): left Riemann sum
104
+ /// Left Riemann sum: sum of f(x_i) × h for i = 0 … n−2.
105
+ /// @since 1.3.0
106
+ /// @param vals Array of n function values × 10000
107
+ /// @param n Number of sample points
108
+ /// @param h_fx Step width × 10000
109
+ /// @returns Approximate integral × 10000
84
110
  fn riemann_left(vals: int[], n: int, h_fx: int): int {
85
111
  let sum: int = 0;
86
112
  let i: int = 0;
@@ -88,7 +114,12 @@ fn riemann_left(vals: int[], n: int, h_fx: int): int {
88
114
  return sum * h_fx / 10000;
89
115
  }
90
116
 
91
- // riemann_right(vals, n, h_fx): right Riemann sum
117
+ /// Right Riemann sum: sum of f(x_i) × h for i = 1 … n−1.
118
+ /// @since 1.3.0
119
+ /// @param vals Array of n function values × 10000
120
+ /// @param n Number of sample points
121
+ /// @param h_fx Step width × 10000
122
+ /// @returns Approximate integral × 10000
92
123
  fn riemann_right(vals: int[], n: int, h_fx: int): int {
93
124
  let sum: int = 0;
94
125
  let i: int = 1;
@@ -96,8 +127,12 @@ fn riemann_right(vals: int[], n: int, h_fx: int): int {
96
127
  return sum * h_fx / 10000;
97
128
  }
98
129
 
99
- // riemann_mid(vals, n, h_fx): midpoint Riemann sum
100
- // vals: midpoint values (n-1 midpoints for n-1 intervals)
130
+ /// Midpoint Riemann sum using precomputed midpoint values.
131
+ /// @since 1.3.0
132
+ /// @param vals Array of n midpoint values × 10000 (one per interval)
133
+ /// @param n Number of intervals (i.e. length of vals)
134
+ /// @param h_fx Step width × 10000
135
+ /// @returns Approximate integral × 10000
101
136
  fn riemann_mid(vals: int[], n: int, h_fx: int): int {
102
137
  let sum: int = 0;
103
138
  let i: int = 0;
@@ -107,8 +142,12 @@ fn riemann_mid(vals: int[], n: int, h_fx: int): int {
107
142
 
108
143
  // ─── Curve length ────────────────────────────────────────────────────────────
109
144
 
110
- // curve_length_2d(xs, ys, n): approximate arc length of a 2D polyline
111
- // xs, ys: x and y coordinates ×10000 of n points
145
+ /// Approximate arc length of a 2-D polyline through n points using the Euclidean distance between consecutive points.
146
+ /// @since 1.3.0
147
+ /// @param xs X coordinates × 10000 of the n points
148
+ /// @param ys Y coordinates × 10000 of the n points
149
+ /// @param n Number of points (must be ≥ 2)
150
+ /// @returns Approximate arc length × 10000
112
151
  fn curve_length_2d(xs: int[], ys: int[], n: int): int {
113
152
  let total: int = 0;
114
153
  let i: int = 0;
@@ -124,26 +163,43 @@ fn curve_length_2d(xs: int[], ys: int[], n: int): int {
124
163
 
125
164
  // ─── Running statistics ───────────────────────────────────────────────────────
126
165
 
127
- // running_mean(prev_mean, new_val, n): Welford's online mean update
128
- // prev_mean ×10000, new_val ×10000, n: count after adding new_val (n ≥ 1)
166
+ /// Welford's online algorithm: update a running mean with a new sample.
167
+ /// @since 1.3.0
168
+ /// @param prev_mean Previous mean × 10000
169
+ /// @param new_val New sample value × 10000
170
+ /// @param n Total count after adding the new sample (n ≥ 1)
171
+ /// @returns Updated mean × 10000
129
172
  fn running_mean(prev_mean: int, new_val: int, n: int): int {
130
173
  if (n <= 1) { return new_val; }
131
174
  return prev_mean + (new_val - prev_mean) * 10000 / (n * 10000);
132
175
  }
133
176
 
134
- // running_m2(prev_m2, prev_mean, new_mean, new_val): Welford's M2 update
135
- // Used to compute variance: variance = m2 / (n-1)
177
+ /// Welford's online algorithm: update the M2 accumulator used to compute variance.
178
+ /// Variance = running_m2 / (n1) after n samples.
179
+ /// @since 1.3.0
180
+ /// @param prev_m2 Previous M2 accumulator × 10000
181
+ /// @param prev_mean Mean before adding the new sample × 10000
182
+ /// @param new_mean Mean after adding the new sample × 10000
183
+ /// @param new_val New sample value × 10000
184
+ /// @returns Updated M2 accumulator × 10000
136
185
  fn running_m2(prev_m2: int, prev_mean: int, new_mean: int, new_val: int): int {
137
186
  return prev_m2 + (new_val - prev_mean) * (new_val - new_mean) / 10000;
138
187
  }
139
188
 
140
- // variance_from_m2(m2, n): get variance from Welford's M2, n = number of samples
189
+ /// Compute sample variance from a Welford M2 accumulator and sample count.
190
+ /// @since 1.3.0
191
+ /// @param m2 M2 accumulator from `running_m2` × 10000
192
+ /// @param n Number of samples collected
193
+ /// @returns Sample variance × 10000; returns 0 for n ≤ 1
141
194
  fn variance_from_m2(m2: int, n: int): int {
142
195
  if (n <= 1) { return 0; }
143
196
  return m2 / (n - 1);
144
197
  }
145
198
 
146
- // std_dev_approx(variance_fx): approximate std dev = variance
199
+ /// Approximate standard deviation as the integer square root of the variance.
200
+ /// @since 1.3.0
201
+ /// @param variance_fx Variance × 10000 (e.g. from `variance_from_m2`)
202
+ /// @returns √variance × 10000; returns 0 for non-positive input
147
203
  fn std_dev_approx(variance_fx: int): int {
148
204
  if (variance_fx <= 0) { return 0; }
149
205
  return isqrt(variance_fx * 100) * 100 / 10000;