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,240 @@
1
+ // set_int.mcrs — Integer set helpers backed by NBT int lists.
2
+ //
3
+ // Sets are stored in `storage rs:set_int` under a caller-provided field name:
4
+ //
5
+ // rs:set_int { MySet: [1, 4, 9] }
6
+ //
7
+ // `set_name`, `a`, `b`, and `result` are interpolated directly into the NBT
8
+ // path, so callers should use path-safe identifiers such as `MySet`,
9
+ // `enemy_ids`, or `tmp_union`.
10
+
11
+ module library;
12
+
13
+ fn __set_int_load_items_apply() {
14
+ raw("$data modify storage __NS__:arrays items set from storage rs:set_int $(set_name)");
15
+ }
16
+
17
+ fn __set_int_store_items_apply() {
18
+ raw("$data modify storage rs:set_int $(set_name) set from storage __NS__:arrays items");
19
+ }
20
+
21
+ fn __set_int_store_kept_apply() {
22
+ raw("$data modify storage rs:set_int $(set_name) set from storage __NS__:arrays kept");
23
+ }
24
+
25
+ fn __set_int_size_apply() {
26
+ raw("$execute store result score $ret __OBJ__ run data get storage rs:set_int $(set_name)");
27
+ }
28
+
29
+ fn __set_int_clear_apply() {
30
+ raw("$data modify storage rs:set_int $(set_name) set value []");
31
+ }
32
+
33
+ fn __set_int_load_left_apply() {
34
+ raw("$data modify storage __NS__:arrays left set from storage rs:set_int $(a)");
35
+ }
36
+
37
+ fn __set_int_load_right_apply() {
38
+ raw("$data modify storage __NS__:arrays right set from storage rs:set_int $(b)");
39
+ }
40
+
41
+ fn __set_int_store_merged_apply() {
42
+ raw("$data modify storage rs:set_int $(result) set from storage __NS__:arrays merged");
43
+ }
44
+
45
+ fn __set_int_store_shared_apply() {
46
+ raw("$data modify storage rs:set_int $(result) set from storage __NS__:arrays shared");
47
+ }
48
+
49
+ /// Returns 1 if `value` exists in the given temporary array, otherwise 0.
50
+ ///
51
+ /// @param arr Temporary array to scan
52
+ /// @param value Integer value to look for
53
+ /// @returns 1 if found, otherwise 0
54
+ fn _set_int_array_has(arr: int[], value: int): int {
55
+ let n: int = list_len(arr);
56
+ let i: int = 0;
57
+ while (i < n) {
58
+ if (arr[i] == value) { return 1; }
59
+ i = i + 1;
60
+ }
61
+ return 0;
62
+ }
63
+
64
+ /// Appends `value` to `arr` only when it is not already present.
65
+ ///
66
+ /// @param arr Temporary array used as a working set
67
+ /// @param value Integer value to append
68
+ fn _set_int_array_add_unique(arr: int[], value: int) {
69
+ if (_set_int_array_has(arr, value) == 0) {
70
+ arr.push(value);
71
+ }
72
+ }
73
+
74
+ /// Adds an integer to `storage rs:set_int.{set_name}` if it is not already present.
75
+ ///
76
+ /// Missing sets are created automatically as empty lists before insertion.
77
+ ///
78
+ /// @since 3.0.0
79
+ /// @param set_name Set name under `storage rs:set_int`
80
+ /// @param value Integer value to insert
81
+ /// @example
82
+ /// set_add("Visited", 42)
83
+ fn set_add(set_name: string, value: int) {
84
+ let items: int[] = [];
85
+ raw("data modify storage __NS__:arrays items set value []");
86
+ raw("data modify storage rs:macro_args set_name set from storage rs:strings __sp0");
87
+ raw("function __NS__:__set_int_load_items_apply with storage rs:macro_args");
88
+ _set_int_array_add_unique(items, value);
89
+ raw("function __NS__:__set_int_store_items_apply with storage rs:macro_args");
90
+ }
91
+
92
+ /// Checks whether an integer exists in `storage rs:set_int.{set_name}`.
93
+ ///
94
+ /// @since 3.0.0
95
+ /// @param set_name Set name under `storage rs:set_int`
96
+ /// @param value Integer value to test
97
+ /// @returns 1 if the value exists, otherwise 0
98
+ /// @example
99
+ /// if (set_has("Visited", 42) == 1) { }
100
+ fn set_has(set_name: string, value: int): int {
101
+ let items: int[] = [];
102
+ raw("data modify storage __NS__:arrays items set value []");
103
+ raw("data modify storage rs:macro_args set_name set from storage rs:strings __sp0");
104
+ raw("function __NS__:__set_int_load_items_apply with storage rs:macro_args");
105
+ return _set_int_array_has(items, value);
106
+ }
107
+
108
+ /// Removes an integer from `storage rs:set_int.{set_name}`.
109
+ ///
110
+ /// Removing a missing value is a no-op.
111
+ ///
112
+ /// @since 3.0.0
113
+ /// @param set_name Set name under `storage rs:set_int`
114
+ /// @param value Integer value to remove
115
+ /// @example
116
+ /// set_remove("Visited", 42)
117
+ fn set_remove(set_name: string, value: int) {
118
+ let items: int[] = [];
119
+ let kept: int[] = [];
120
+ raw("data modify storage __NS__:arrays items set value []");
121
+ raw("data modify storage __NS__:arrays kept set value []");
122
+ raw("data modify storage rs:macro_args set_name set from storage rs:strings __sp0");
123
+ raw("function __NS__:__set_int_load_items_apply with storage rs:macro_args");
124
+
125
+ let n: int = list_len(items);
126
+ let i: int = 0;
127
+ while (i < n) {
128
+ let cur: int = items[i];
129
+ if (cur != value) {
130
+ kept.push(cur);
131
+ }
132
+ i = i + 1;
133
+ }
134
+
135
+ raw("function __NS__:__set_int_store_kept_apply with storage rs:macro_args");
136
+ }
137
+
138
+ /// Returns the number of elements in `storage rs:set_int.{set_name}`.
139
+ ///
140
+ /// Missing sets return `0`.
141
+ ///
142
+ /// @since 3.0.0
143
+ /// @param set_name Set name under `storage rs:set_int`
144
+ /// @returns Current element count
145
+ /// @example
146
+ /// let count: int = set_size("Visited")
147
+ fn set_size(set_name: string): int {
148
+ raw("scoreboard players set $ret __OBJ__ 0");
149
+ raw("data modify storage rs:macro_args set_name set from storage rs:strings __sp0");
150
+ raw("function __NS__:__set_int_size_apply with storage rs:macro_args");
151
+ raw("return 1");
152
+ return 0;
153
+ }
154
+
155
+ /// Clears all elements from `storage rs:set_int.{set_name}`.
156
+ ///
157
+ /// @since 3.0.0
158
+ /// @param set_name Set name under `storage rs:set_int`
159
+ /// @example
160
+ /// set_clear("Visited")
161
+ fn set_clear(set_name: string) {
162
+ raw("data modify storage rs:macro_args set_name set from storage rs:strings __sp0");
163
+ raw("function __NS__:__set_int_clear_apply with storage rs:macro_args");
164
+ }
165
+
166
+ /// Computes `result = a ∪ b`.
167
+ ///
168
+ /// The destination set is overwritten with a deduplicated list.
169
+ ///
170
+ /// @since 3.0.0
171
+ /// @param a Left-hand input set name
172
+ /// @param b Right-hand input set name
173
+ /// @param result Destination set name
174
+ /// @example
175
+ /// set_union("SeenA", "SeenB", "SeenAll")
176
+ fn set_union(a: string, b: string, result: string) {
177
+ let left: int[] = [];
178
+ let right: int[] = [];
179
+ let merged: int[] = [];
180
+ raw("data modify storage __NS__:arrays left set value []");
181
+ raw("data modify storage __NS__:arrays right set value []");
182
+ raw("data modify storage __NS__:arrays merged set value []");
183
+ raw("data modify storage rs:macro_args a set from storage rs:strings __sp0");
184
+ raw("data modify storage rs:macro_args b set from storage rs:strings __sp1");
185
+ raw("data modify storage rs:macro_args result set from storage rs:strings __sp2");
186
+ raw("function __NS__:__set_int_load_left_apply with storage rs:macro_args");
187
+ raw("function __NS__:__set_int_load_right_apply with storage rs:macro_args");
188
+
189
+ let left_n: int = list_len(left);
190
+ let i: int = 0;
191
+ while (i < left_n) {
192
+ _set_int_array_add_unique(merged, left[i]);
193
+ i = i + 1;
194
+ }
195
+
196
+ let right_n: int = list_len(right);
197
+ let j: int = 0;
198
+ while (j < right_n) {
199
+ _set_int_array_add_unique(merged, right[j]);
200
+ j = j + 1;
201
+ }
202
+
203
+ raw("function __NS__:__set_int_store_merged_apply with storage rs:macro_args");
204
+ }
205
+
206
+ /// Computes `result = a ∩ b`.
207
+ ///
208
+ /// The destination set is overwritten with a deduplicated list.
209
+ ///
210
+ /// @since 3.0.0
211
+ /// @param a Left-hand input set name
212
+ /// @param b Right-hand input set name
213
+ /// @param result Destination set name
214
+ /// @example
215
+ /// set_intersect("SeenA", "SeenB", "SeenBoth")
216
+ fn set_intersect(a: string, b: string, result: string) {
217
+ let left: int[] = [];
218
+ let right: int[] = [];
219
+ let shared: int[] = [];
220
+ raw("data modify storage __NS__:arrays left set value []");
221
+ raw("data modify storage __NS__:arrays right set value []");
222
+ raw("data modify storage __NS__:arrays shared set value []");
223
+ raw("data modify storage rs:macro_args a set from storage rs:strings __sp0");
224
+ raw("data modify storage rs:macro_args b set from storage rs:strings __sp1");
225
+ raw("data modify storage rs:macro_args result set from storage rs:strings __sp2");
226
+ raw("function __NS__:__set_int_load_left_apply with storage rs:macro_args");
227
+ raw("function __NS__:__set_int_load_right_apply with storage rs:macro_args");
228
+
229
+ let left_n: int = list_len(left);
230
+ let i: int = 0;
231
+ while (i < left_n) {
232
+ let cur: int = left[i];
233
+ if (_set_int_array_has(right, cur) == 1) {
234
+ _set_int_array_add_unique(shared, cur);
235
+ }
236
+ i = i + 1;
237
+ }
238
+
239
+ raw("function __NS__:__set_int_store_shared_apply with storage rs:macro_args");
240
+ }
@@ -1,20 +1,50 @@
1
- // Runtime Set implementation using NBT storage.
2
- // Sets are stored as NBT arrays with uniqueness enforced on add.
3
- //
4
- // Note: This is reference documentation for the builtins.
5
- // Actual implementation is in the compiler.
6
- //
7
- // fn set_new() -> string
8
- // Creates a new empty set. Returns a unique set ID.
9
- //
10
- // fn set_add(set: string, value: string)
11
- // Adds a value to the set if it is not already present.
1
+ // sets.mcrs — Runtime Set implementation using NBT storage.
12
2
  //
13
- // fn set_contains(set: string, value: string) -> int
14
- // Returns 1 if the value exists in the set, 0 otherwise.
15
- //
16
- // fn set_remove(set: string, value: string)
17
- // Removes a value from the set.
18
- //
19
- // fn set_clear(set: string)
20
- // Removes all values from the set.
3
+ // Sets are stored as NBT arrays with uniqueness enforced on add.
4
+ // The actual implementation lives in the compiler these are documentation stubs.
5
+
6
+ module library;
7
+
8
+ /// Create a new empty set and return its unique set ID (string handle).
9
+ /// @since 1.1.0
10
+ /// @returns A unique set ID used by all other set operations
11
+ /// @example
12
+ /// let s: string = set_new();
13
+ /// set_add(s, "apple");
14
+ fn set_new(): string {
15
+ raw("# compiler builtin — do not call directly");
16
+ return "";
17
+ }
18
+
19
+ /// Add a value to the set if it is not already present (no-op if already contained).
20
+ /// @since 1.1.0
21
+ /// @param set Set ID returned by `set_new`
22
+ /// @param value Value to add
23
+ fn set_add(set: string, value: string) {
24
+ raw("# compiler builtin — do not call directly");
25
+ }
26
+
27
+ /// Test whether a value exists in the set.
28
+ /// @since 1.1.0
29
+ /// @param set Set ID returned by `set_new`
30
+ /// @param value Value to look up
31
+ /// @returns 1 if the value is in the set, 0 otherwise
32
+ fn set_contains(set: string, value: string): int {
33
+ raw("# compiler builtin — do not call directly");
34
+ return 0;
35
+ }
36
+
37
+ /// Remove a value from the set (no-op if not present).
38
+ /// @since 1.1.0
39
+ /// @param set Set ID returned by `set_new`
40
+ /// @param value Value to remove
41
+ fn set_remove(set: string, value: string) {
42
+ raw("# compiler builtin — do not call directly");
43
+ }
44
+
45
+ /// Remove all values from the set, leaving it empty.
46
+ /// @since 1.1.0
47
+ /// @param set Set ID returned by `set_new`
48
+ fn set_clear(set: string) {
49
+ raw("# compiler builtin — do not call directly");
50
+ }
@@ -9,15 +9,30 @@ module library;
9
9
 
10
10
  // ─── Uniform distribution ────────────────────────────────────────────────────
11
11
 
12
- // uniform_int(seed, lo, hi): integer in [lo, hi] inclusive
13
- // Returns new seed for chaining: use the result as next seed input.
12
+ /// Return a uniform integer in `[lo, hi]` inclusive.
13
+ ///
14
+ /// Uses LCG RNG. Pass the result as the seed for the next call to chain samples.
15
+ ///
16
+ /// @since 2.0.0
17
+ /// @param seed Any integer seed value
18
+ /// @param lo Inclusive lower bound
19
+ /// @param hi Inclusive upper bound
20
+ /// @returns Pseudo-random integer in [lo, hi]
21
+ /// @example
22
+ /// let dmg: int = uniform_int(seed, 5, 15)
14
23
  fn uniform_int(seed: int, lo: int, hi: int): int {
15
24
  let r: int = seed * 1664525 + 1013904223;
16
25
  if (r < 0) { r = 0 - r; }
17
26
  return lo + r % (hi - lo + 1);
18
27
  }
19
28
 
20
- // uniform_frac(seed): uniform fraction in [0, 10000] (×10000 scale)
29
+ /// Return a uniform fraction in [0, 10000] (×10000 scale).
30
+ ///
31
+ /// @since 2.0.0
32
+ /// @param seed Any integer seed value
33
+ /// @returns Pseudo-random integer in [0, 10000]
34
+ /// @example
35
+ /// let frac: int = uniform_frac(seed)
21
36
  fn uniform_frac(seed: int): int {
22
37
  let r: int = seed * 1664525 + 1013904223;
23
38
  if (r < 0) { r = 0 - r; }
@@ -25,13 +40,17 @@ fn uniform_frac(seed: int): int {
25
40
  }
26
41
 
27
42
  // ─── Normal (Gaussian) approximation ─────────────────────────────────────────
28
- //
29
- // Method: Sum of 12 uniform [0,1] random values subtract 6 scale.
30
- // Result approximates N(0,1). Good enough for game use.
31
- // (Box-Muller requires sqrt/ln; this is cheaper and sufficient.)
32
- //
33
- // normal_approx12(seed): approximate N(0, 1) × 10000, range ≈ [-60000, 60000]
34
- // Each call consumes the seed 12 times (chains internally).
43
+
44
+ /// Approximate N(0, 1) variate using the Irwin–Hall method (sum of 12 uniform samples).
45
+ ///
46
+ /// Result is in ×10000 scale, range approximately [−60000, 60000].
47
+ /// Each call chains the seed 12 times internally.
48
+ ///
49
+ /// @since 2.0.0
50
+ /// @param seed Any integer seed value
51
+ /// @returns Approximate N(0,1) sample ×10000
52
+ /// @example
53
+ /// let z: int = normal_approx12(seed)
35
54
  fn normal_approx12(seed: int): int {
36
55
  let s: int = seed;
37
56
  let sum: int = 0;
@@ -54,21 +73,25 @@ fn normal_approx12(seed: int): int {
54
73
  }
55
74
 
56
75
  // ─── Exponential distribution ─────────────────────────────────────────────────
57
- //
58
- // Method: -ln(U) / λ where U is uniform [0,1].
59
- // Approximation: use ln from stdlib/math.
60
- //
61
- // exp_dist_approx(seed, lambda_fx): exponential variate × 10000
62
- // lambda_fx: rate parameter × 10000 (e.g. 10000 = rate 1.0)
63
- // Returns value in [0, ∞) × 10000, but caps at 100000 (10.0) for MC sanity.
64
- // Note: requires import "stdlib/math" for ln function.
76
+
77
+ /// Sample from an exponential distribution with rate `lambda_fx`.
78
+ ///
79
+ /// Method: `-ln(U) / λ` where `U ~ Uniform(0.01, 1)`. Result is capped at
80
+ /// `100000` (= 10.0 × 10000) for Minecraft sanity.
81
+ ///
82
+ /// Requires `import "stdlib/math"` for the `ln` function.
83
+ ///
84
+ /// @since 2.0.0
85
+ /// @param seed Any integer seed value
86
+ /// @param lambda_fx Rate parameter ×10000 (e.g. `10000` = rate 1.0)
87
+ /// @returns Exponential variate ×10000, capped at 100000
88
+ /// @example
89
+ /// let wait: int = exp_dist_approx(seed, 10000)
65
90
  fn exp_dist_approx(seed: int, lambda_fx: int): int {
66
91
  let r: int = seed * 1664525 + 1013904223;
67
92
  if (r < 0) { r = 0 - r; }
68
93
  let u: int = 100 + r % 9901; // uniform in [100, 10000] (avoid ln(0))
69
94
  // -ln(u/10000) × 10000 / lambda_fx
70
- // ln(u) where u is ×10000 → use existing ln(u) which returns ×10000
71
- // -ln(u/10000) = -(ln(u) - ln(10000)) = ln(10000) - ln(u)
72
95
  // ln(10000) × 10000 ≈ 92103
73
96
  let ln_u: int = ln(u); // requires stdlib/math
74
97
  let neg_ln: int = 92103 - ln_u;
@@ -80,8 +103,14 @@ fn exp_dist_approx(seed: int, lambda_fx: int): int {
80
103
 
81
104
  // ─── Bernoulli trial ──────────────────────────────────────────────────────────
82
105
 
83
- // bernoulli(seed, p_fx): 1 with probability p/10000, else 0.
84
- // p_fx: probability × 10000 (e.g. 5000 = 50%, 1000 = 10%)
106
+ /// Return `1` with probability `p_fx / 10000`, otherwise `0`.
107
+ ///
108
+ /// @since 2.0.0
109
+ /// @param seed Any integer seed value
110
+ /// @param p_fx Probability ×10000 (e.g. `5000` = 50%, `1000` = 10%)
111
+ /// @returns `1` with the given probability, `0` otherwise
112
+ /// @example
113
+ /// if (bernoulli(seed, 3000) == 1) { /* 30% chance */ }
85
114
  fn bernoulli(seed: int, p_fx: int): int {
86
115
  let r: int = seed * 1664525 + 1013904223;
87
116
  if (r < 0) { r = 0 - r; }
@@ -91,7 +120,15 @@ fn bernoulli(seed: int, p_fx: int): int {
91
120
 
92
121
  // ─── Weighted choice ──────────────────────────────────────────────────────────
93
122
 
94
- // weighted2(seed, w0, w1): choose 0 or 1 with weights w0, w1
123
+ /// Choose `0` or `1` with the given integer weights.
124
+ ///
125
+ /// @since 2.0.0
126
+ /// @param seed Any integer seed value
127
+ /// @param w0 Weight for outcome `0`
128
+ /// @param w1 Weight for outcome `1`
129
+ /// @returns `0` or `1` sampled proportionally to the weights
130
+ /// @example
131
+ /// let side: int = weighted2(seed, 3, 7)
95
132
  fn weighted2(seed: int, w0: int, w1: int): int {
96
133
  let total: int = w0 + w1;
97
134
  let r: int = seed * 1664525 + 1013904223;
@@ -100,7 +137,16 @@ fn weighted2(seed: int, w0: int, w1: int): int {
100
137
  return 1;
101
138
  }
102
139
 
103
- // weighted3(seed, w0, w1, w2): choose 0, 1, or 2 with given weights
140
+ /// Choose `0`, `1`, or `2` with the given integer weights.
141
+ ///
142
+ /// @since 2.0.0
143
+ /// @param seed Any integer seed value
144
+ /// @param w0 Weight for outcome `0`
145
+ /// @param w1 Weight for outcome `1`
146
+ /// @param w2 Weight for outcome `2`
147
+ /// @returns `0`, `1`, or `2` sampled proportionally to the weights
148
+ /// @example
149
+ /// let tier: int = weighted3(seed, 50, 30, 20)
104
150
  fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
105
151
  let total: int = w0 + w1 + w2;
106
152
  let r: int = seed * 1664525 + 1013904223;
@@ -112,15 +158,19 @@ fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
112
158
  }
113
159
 
114
160
  // ─── Gamma distribution ───────────────────────────────────────────────────────
115
- //
116
- // gamma_sample(shape_k, scale_theta, seed): Gamma(k, theta) × 10000
117
- // Method: sum of k independent Exponential(theta) samples.
118
- // Exponential(theta) = -theta * ln(U) where U ~ Uniform(0,1).
119
- // shape_k: integer shape parameter × 10000 (e.g. 10000 = k=1, 20000 = k=2)
120
- // scale_theta: scale parameter × 10000 (e.g. 10000 = theta=1.0)
121
- // seed: any integer seed
122
- // Returns: Gamma variate × 10000. Handles k = 1..5 via loop.
123
- // Requires: ln (stdlib/math), uniform_int (stdlib/signal)
161
+
162
+ /// Sample from a Gamma(k, θ) distribution via summing k exponential samples.
163
+ ///
164
+ /// Handles integer shape `k = 1..5` (pass `shape_k × 10000`).
165
+ /// Requires `ln` from `stdlib/math`.
166
+ ///
167
+ /// @since 2.0.0
168
+ /// @param shape_k Shape parameter k ×10000 (e.g. `20000` = k=2)
169
+ /// @param scale_theta Scale parameter θ ×10000 (e.g. `10000` = θ=1.0)
170
+ /// @param seed Any integer seed value
171
+ /// @returns Gamma variate ×10000
172
+ /// @example
173
+ /// let g: int = gamma_sample(20000, 10000, seed)
124
174
  fn gamma_sample(shape_k: int, scale_theta: int, seed: int): int {
125
175
  // Gamma(k, theta) = sum of k Exponential(theta) samples
126
176
  // Exponential(theta) = -theta * ln(U), U ~ Uniform(0.1, 0.9999)
@@ -145,14 +195,18 @@ fn gamma_sample(shape_k: int, scale_theta: int, seed: int): int {
145
195
  }
146
196
 
147
197
  // ─── Poisson distribution ─────────────────────────────────────────────────────
148
- //
149
- // poisson_sample(lambda, seed): Poisson(lambda) count
150
- // Method: Knuth algorithm — count uniform products until product < e^(-lambda).
151
- // lambda: rate parameter × 10000 (e.g. 30000 = lambda=3.0)
152
- // seed: any integer seed
153
- // Returns: non-negative integer count (plain int, not ×10000).
154
- // Works well for lambda ≤ 20 (200000 in ×10000). Hard cap at 100 iterations.
155
- // Requires: exp_fx (stdlib/math), uniform_int (stdlib/signal)
198
+
199
+ /// Sample from a Poisson(λ) distribution using the Knuth algorithm.
200
+ ///
201
+ /// Works well for `lambda 20` (200000 in ×10000). Hard cap at 100 iterations.
202
+ /// Requires `exp_fx` from `stdlib/math`.
203
+ ///
204
+ /// @since 2.0.0
205
+ /// @param lambda Rate parameter ×10000 (e.g. `30000` = λ=3.0)
206
+ /// @param seed Any integer seed value
207
+ /// @returns Poisson count (plain integer, not ×10000)
208
+ /// @example
209
+ /// let n: int = poisson_sample(30000, seed)
156
210
  fn poisson_sample(lambda: int, seed: int): int {
157
211
  let neg_lambda: int = 0 - lambda;
158
212
  let L: int = exp_fx(neg_lambda);
@@ -168,13 +222,17 @@ fn poisson_sample(lambda: int, seed: int): int {
168
222
  }
169
223
 
170
224
  // ─── Geometric distribution ───────────────────────────────────────────────────
171
- //
172
- // geometric_sample(p_success, seed): Geometric(p) failures before first success
173
- // Method: floor(ln(U) / ln(1-p))
174
- // p_success: success probability × 10000 (e.g. 5000 = p=0.5)
175
- // seed: any integer seed
176
- // Returns: non-negative integer count of failures.
177
- // Requires: ln (stdlib/math), uniform_int (stdlib/signal)
225
+
226
+ /// Sample from a Geometric(p) distribution (number of failures before first success).
227
+ ///
228
+ /// Method: `floor(ln(U) / ln(1 - p))`. Requires `ln` from `stdlib/math`.
229
+ ///
230
+ /// @since 2.0.0
231
+ /// @param p_success Success probability ×10000 (e.g. `5000` = p=0.5)
232
+ /// @param seed Any integer seed value
233
+ /// @returns Non-negative integer count of failures
234
+ /// @example
235
+ /// let fails: int = geometric_sample(5000, seed)
178
236
  fn geometric_sample(p_success: int, seed: int): int {
179
237
  let u: int = uniform_int(seed, 1, 9999);
180
238
  let ln_u: int = ln(u);
@@ -186,14 +244,18 @@ fn geometric_sample(p_success: int, seed: int): int {
186
244
  }
187
245
 
188
246
  // ─── Negative Binomial distribution ──────────────────────────────────────────
189
- //
190
- // negative_binomial_sample(r, p_success, seed): NegBin(r, p) — failures before r successes
191
- // Method: sum r independent Geometric(p) samples.
192
- // r: number of successes (plain integer, e.g. 1, 2, 3)
193
- // p_success: success probability × 10000 (e.g. 5000 = p=0.5)
194
- // seed: any integer seed
195
- // Returns: non-negative integer count of total failures.
196
- // Requires: geometric_sample
247
+
248
+ /// Sample from a Negative Binomial NegBin(r, p) distribution.
249
+ ///
250
+ /// Method: sum `r` independent Geometric(p) samples.
251
+ ///
252
+ /// @since 2.0.0
253
+ /// @param r Number of successes (plain integer, e.g. 1, 2, 3)
254
+ /// @param p_success Success probability ×10000 (e.g. `5000` = p=0.5)
255
+ /// @param seed Any integer seed value
256
+ /// @returns Total number of failures before `r` successes
257
+ /// @example
258
+ /// let n: int = negative_binomial_sample(3, 5000, seed)
197
259
  fn negative_binomial_sample(r: int, p_success: int, seed: int): int {
198
260
  let s: int = 0;
199
261
  let i: int = 0;
@@ -205,7 +267,7 @@ fn negative_binomial_sample(r: int, p_success: int, seed: int): int {
205
267
  }
206
268
 
207
269
  // ─── DFT helpers ──────────────────────────────────────────────────────────────
208
- //
270
+
209
271
  // _sin45(q): sin(q × 45°) × 10000, q = 0..7 (handles full circle in 45° steps)
210
272
  // Pure arithmetic — no NBT storage required. Works in MCRuntime for testing.
211
273
  fn _sin45(q: int): int {
@@ -226,24 +288,20 @@ fn _cos45(q: int): int {
226
288
  return _sin45(q + 2); // cos(x) = sin(x + 90°) = sin((q+2)×45°)
227
289
  }
228
290
 
229
- // ─── Discrete Fourier Transform (fixed-point, n 8) ─────────────────────────
230
- //
231
- // Computes DFT bin k of a real-valued signal with n samples.
232
- // All values use ×10000 scale.
233
- //
234
- // Angle convention: 360*k*j/n degrees always a multiple of 45° for n ≤ 8.
235
- // Trig is handled by _sin45/_cos45 which take a 45°-step index.
236
- //
237
- // dft_real(s0..s7, n, k): real part of DFT bin k
238
- // real[k] = (1/n) × Σ(j=0..n-1) samples[j] × cos(2π k j / n)
239
- // Return value ×10000.
240
- //
241
- // To keep within int32: divide each term by 10000 before accumulating,
242
- // then divide the sum by n at the end.
243
- //
244
- // Note: passes samples as 8 explicit integers (s0..s7).
245
- // Use s0..s(n-1); remaining args are ignored based on n.
246
-
291
+ /// Real part of DFT bin `k` for a real-valued signal with up to 8 samples.
292
+ ///
293
+ /// All values use ×10000 scale. Angle convention: multiples of 45°.
294
+ /// Unused sample arguments (beyond `n`) are ignored.
295
+ ///
296
+ /// Formula: `real[k] = (1/n) Σ samples[j] × cos(2πkj/n)`
297
+ ///
298
+ /// @since 2.0.0
299
+ /// @param s0 Sample 0 ×10000 … @param s7 Sample 7 ×10000
300
+ /// @param n Number of samples (1–8)
301
+ /// @param k Bin index (0 to n−1)
302
+ /// @returns Real part of DFT bin k, ×10000
303
+ /// @example
304
+ /// let re0: int = dft_real(10000, 0, -10000, 0, 0, 0, 0, 0, 4, 0)
247
305
  fn dft_real(s0: int, s1: int, s2: int, s3: int,
248
306
  s4: int, s5: int, s6: int, s7: int,
249
307
  n: int, k: int): int {
@@ -282,8 +340,15 @@ fn dft_real(s0: int, s1: int, s2: int, s3: int,
282
340
  return acc / n;
283
341
  }
284
342
 
285
- // dft_imag(s0..s7, n, k): imaginary part of DFT bin k (negative sine convention)
286
- // imag[k] = -(1/n) × Σ(j=0..n-1) samples[j] × sin(2π k j / n)
343
+ /// Imaginary part of DFT bin `k` for a real-valued signal with up to 8 samples.
344
+ ///
345
+ /// Uses the negative-sine convention: `imag[k] = -(1/n) Σ samples[j] × sin(2πkj/n)`
346
+ ///
347
+ /// @since 2.0.0
348
+ /// @param s0 Sample 0 ×10000 … @param s7 Sample 7 ×10000
349
+ /// @param n Number of samples (1–8)
350
+ /// @param k Bin index (0 to n−1)
351
+ /// @returns Imaginary part of DFT bin k, ×10000
287
352
  fn dft_imag(s0: int, s1: int, s2: int, s3: int,
288
353
  s4: int, s5: int, s6: int, s7: int,
289
354
  n: int, k: int): int {
@@ -321,8 +386,15 @@ fn dft_imag(s0: int, s1: int, s2: int, s3: int,
321
386
  return 0 - (acc / n);
322
387
  }
323
388
 
324
- // dft_magnitude(s0..s7, n, k): magnitude of DFT bin k
325
- // magnitude = sqrt_fx(real² + imag²) where both real,imag are ×10000
389
+ /// Magnitude of DFT bin `k`: `sqrt(real² + imag²)` in ×10000.
390
+ ///
391
+ /// @since 2.0.0
392
+ /// @param s0 Sample 0 ×10000 … @param s7 Sample 7 ×10000
393
+ /// @param n Number of samples (1–8)
394
+ /// @param k Bin index (0 to n−1)
395
+ /// @returns Magnitude of DFT bin k in ×10000
396
+ /// @example
397
+ /// let mag: int = dft_magnitude(10000, 0, -10000, 0, 0, 0, 0, 0, 4, 1)
326
398
  fn dft_magnitude(s0: int, s1: int, s2: int, s3: int,
327
399
  s4: int, s5: int, s6: int, s7: int,
328
400
  n: int, k: int): int {