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
@@ -50,26 +50,29 @@
50
50
 
51
51
  module library;
52
52
 
53
- // ─── dft_noop ────────────────────────────────────────────────────────────────
54
- // Default onDone callback for dft_coro. Does nothing. Replace with your own.
53
+ /// Default no-op completion callback for `dft_coro`. Does nothing.
54
+ ///
55
+ /// @since 2.0.0
55
56
  fn dft_noop(): void {
56
57
  let _unused: int = 0;
57
58
  }
58
59
 
59
- // ─── dft_real ────────────────────────────────────────────────────────────────
60
- //
61
- // Compute the Discrete Fourier Transform of `input[0..n-1]`.
62
- //
63
- // X[k] = Σ_{j=0}^{n-1} x[j] * cos(360*k*j/n) (real part)
64
- // - x[j] * sin(360*k*j/n) (imaginary part)
65
- //
66
- // Parameters:
67
- // input — signal samples in fixed-point ×10000
68
- // n number of samples (≤ 16 recommended)
69
- // out_re output array for real parts (×10000, must be pre-allocated to n)
70
- // out_im output array for imaginary parts (×10000, must be pre-allocated to n)
71
- //
72
- // The caller must pre-fill out_re and out_im to zero before calling.
60
+ /// Compute the Discrete Fourier Transform of `input[0..n-1]`.
61
+ ///
62
+ /// Output arrays must be pre-allocated to length `n` and filled with zeros
63
+ /// before calling.
64
+ ///
65
+ /// Formula: `X[k] = Σ x[j] * (cos(2πkj/n) - i·sin(2πkj/n))`
66
+ ///
67
+ /// @since 2.0.0
68
+ /// @param input Signal samples in fixed-point ×10000
69
+ /// @param n Number of samples (≤ 16 recommended)
70
+ /// @param out_re Pre-allocated output array for real parts (×10000)
71
+ /// @param out_im Pre-allocated output array for imaginary parts (×10000)
72
+ /// @example
73
+ /// let re: int[] = [0, 0, 0, 0]
74
+ /// let im: int[] = [0, 0, 0, 0]
75
+ /// dft_real(sig, 4, re, im)
73
76
  fn dft_real(input: int[], n: int, out_re: int[], out_im: int[]) {
74
77
  let k: int = 0;
75
78
  while (k < n) {
@@ -92,23 +95,22 @@ fn dft_real(input: int[], n: int, out_re: int[], out_im: int[]) {
92
95
  }
93
96
  }
94
97
 
95
- // ─── dft_magnitude ───────────────────────────────────────────────────────────
96
- //
97
- // Return |X[k]| = sqrt(re[k]² + im[k]²) in ×10000 fixed-point.
98
- //
99
- // Uses sqrt_fixed from math.mcrs (which returns ×1000).
100
- // We scale the result ×10 to convert from ×1000 back to ×10000 output scale.
101
- //
102
- // Note: squaring ×10000 values can reach ~10^9 per term, which fits in int32
103
- // as long as |re[k]| and |im[k]| stay below ~46340 (≈ 4.6× the input peak).
104
- // For typical signals this is fine; for amplitudes > 10000 per sample, divide
105
- // inputs by a scale factor before calling to avoid overflow.
98
+ /// Return the magnitude of DFT bin `k`: `|X[k]| = sqrt(re[k]² + im[k]²)` in ×10000.
99
+ ///
100
+ /// Note: squaring ×10000 values can reach ~10⁹ per term, which fits in int32 for
101
+ /// amplitudes ≤ ~46340. For larger amplitudes, scale the input before calling.
102
+ ///
103
+ /// @since 2.0.0
104
+ /// @param re Real output array from `dft_real`
105
+ /// @param im Imaginary output array from `dft_real`
106
+ /// @param k Bin index
107
+ /// @returns Magnitude of bin `k` in ×10000 fixed-point
108
+ /// @example
109
+ /// let mag: int = dft_magnitude(re, im, 1)
106
110
  fn dft_magnitude(re: int[], im: int[], k: int): int {
107
111
  // sum_sq is in ×10000² = ×100000000 scale
108
112
  // We want the result in ×10000, so we compute sqrt( re² + im² ) directly.
109
- // sqrt_fixed(x) = sqrt(x * 1000) / 1 = isqrt(x * 1000)
110
- // We need sqrt(re²+im²) in ×10000, so:
111
- // sqrt_fixed takes x in ×10000 → returns sqrt(x) in ×10000 (approx)
113
+ // sqrt_fixed takes x in ×10000 returns sqrt(x) in ×10000 (approx)
112
114
  // Actually sqrt_fixed(x) returns sqrt(x) * 1000 / sqrt(1000) ...
113
115
  // Simplest: compute isqrt(re[k]*re[k] + im[k]*im[k]) which gives ×10000.
114
116
  let r: int = re[k];
@@ -119,26 +121,35 @@ fn dft_magnitude(re: int[], im: int[], k: int): int {
119
121
  return isqrt(sum_sq * 10000);
120
122
  }
121
123
 
122
- // ─── dft_power ───────────────────────────────────────────────────────────────
123
- //
124
- // Return the power spectrum value for bin k: re[k]²/10000 + im[k]²/10000.
125
- //
126
- // Division by 10000 prevents int32 overflow for values up to ~46340 (×10000).
127
- // The result is in ×10000 scale (power units).
124
+ /// Return the power spectrum value for bin `k`: `re[k]²/10000 + im[k]²/10000`.
125
+ ///
126
+ /// Division by 10000 prevents int32 overflow for values up to ~46340 10000).
127
+ /// The result is in ×10000 scale (power units).
128
+ ///
129
+ /// @since 2.0.0
130
+ /// @param re Real output array from `dft_real`
131
+ /// @param im Imaginary output array from `dft_real`
132
+ /// @param k Bin index
133
+ /// @returns Power of bin `k` in ×10000 units
134
+ /// @example
135
+ /// let power: int = dft_power(re, im, 2)
128
136
  fn dft_power(re: int[], im: int[], k: int): int {
129
137
  let r: int = re[k];
130
138
  let i: int = im[k];
131
139
  return r * r / 10000 + i * i / 10000;
132
140
  }
133
141
 
134
- // ─── dft_coro ────────────────────────────────────────────────────────────────
135
- //
136
- // Coroutine variant of dft_real. Processes 4 output bins (k values) per tick.
137
- // Results are pushed into out_re and out_im as each batch completes.
138
- // Use onDone for notification when the full DFT is finished.
139
- //
140
- // Parameters: same as dft_real.
141
- // The caller must pre-fill out_re and out_im to zero before starting.
142
+ /// Coroutine variant of `dft_real` that processes 4 output bins per tick.
143
+ ///
144
+ /// Results are pushed into `out_re` and `out_im` as each batch completes.
145
+ /// Use `onDone` for notification when the full DFT is finished. Pre-fill both
146
+ /// output arrays with zeros before starting.
147
+ ///
148
+ /// @since 2.0.0
149
+ /// @param input Signal samples in fixed-point ×10000
150
+ /// @param n Number of samples (≤ 16 recommended)
151
+ /// @param out_re Pre-allocated output array for real parts (×10000)
152
+ /// @param out_im Pre-allocated output array for imaginary parts (×10000)
142
153
  @coroutine(batch=4, onDone=dft_noop)
143
154
  fn dft_coro(input: int[], n: int, out_re: int[], out_im: int[]) {
144
155
  let k: int = 0;
@@ -160,18 +171,17 @@ fn dft_coro(input: int[], n: int, out_re: int[], out_im: int[]) {
160
171
  }
161
172
  }
162
173
 
163
- // ─── dft_freq_bin ────────────────────────────────────────────────────────────
164
- //
165
- // Return the frequency (in Hz) corresponding to DFT bin k.
166
- //
167
- // freq = sample_rate_hz * k / n
168
- //
169
- // Example: dft_freq_bin(44100, 16, 4) = 44100 * 4 / 16 = 11025 Hz
170
- //
171
- // Parameters:
172
- // sample_rate_hz — sampling rate in Hz (e.g. 20 for Minecraft tick rate)
173
- // n — transform size
174
- // k — bin index (0 .. n-1)
174
+ /// Return the frequency (Hz) corresponding to DFT bin `k`.
175
+ ///
176
+ /// Formula: `freq = sample_rate_hz * k / n`
177
+ ///
178
+ /// @since 2.0.0
179
+ /// @param sample_rate_hz Sampling rate in Hz (e.g. `20` for Minecraft tick rate)
180
+ /// @param n Transform size (number of samples)
181
+ /// @param k Bin index in range [0, n-1]
182
+ /// @returns Frequency in Hz for bin `k`
183
+ /// @example
184
+ /// let freq: int = dft_freq_bin(20, 8, 3)
175
185
  fn dft_freq_bin(sample_rate_hz: int, n: int, k: int): int {
176
186
  return sample_rate_hz * k / n;
177
187
  }
@@ -9,15 +9,33 @@ module library;
9
9
 
10
10
  // ─── Midpoint ─────────────────────────────────────────────────────────────────
11
11
 
12
- // midpoint_x/y/z(a, b): integer midpoint of two coordinates
12
+ /// Compute the integer midpoint of two coordinates.
13
+ /// @since 1.0.0
14
+ /// @param a First coordinate (any unit)
15
+ /// @param b Second coordinate (any unit)
16
+ /// @returns (a + b) / 2 (integer truncation)
17
+ /// @example
18
+ /// let m: int = midpoint(100, 300) // result: 200
13
19
  fn midpoint(a: int, b: int): int {
14
20
  return (a + b) / 2;
15
21
  }
16
22
 
17
23
  // ─── Bounding box ─────────────────────────────────────────────────────────────
18
24
 
19
- // aabb_contains(px, py, pz, minx, miny, minz, maxx, maxy, maxz):
20
- // Returns 1 if point (px,py,pz) is inside axis-aligned bounding box, 0 otherwise.
25
+ /// Test whether a 3D point is inside an axis-aligned bounding box (AABB).
26
+ /// @since 1.0.0
27
+ /// @param px Point X coordinate
28
+ /// @param py Point Y coordinate
29
+ /// @param pz Point Z coordinate
30
+ /// @param minx AABB minimum X (inclusive)
31
+ /// @param miny AABB minimum Y (inclusive)
32
+ /// @param minz AABB minimum Z (inclusive)
33
+ /// @param maxx AABB maximum X (inclusive)
34
+ /// @param maxy AABB maximum Y (inclusive)
35
+ /// @param maxz AABB maximum Z (inclusive)
36
+ /// @returns 1 if point is inside or on the boundary of the AABB, 0 otherwise
37
+ /// @example
38
+ /// let inside: int = aabb_contains(50, 64, 50, 0, 60, 0, 100, 70, 100)
21
39
  fn aabb_contains(px: int, py: int, pz: int,
22
40
  minx: int, miny: int, minz: int,
23
41
  maxx: int, maxy: int, maxz: int): int {
@@ -30,9 +48,18 @@ fn aabb_contains(px: int, py: int, pz: int,
30
48
  return 1;
31
49
  }
32
50
 
33
- // sphere_contains(px, py, pz, cx, cy, cz, r):
34
- // Returns 1 if point is inside sphere (all coords in same unit, r is radius).
35
- // Avoids sqrt by comparing squared distances.
51
+ /// Test whether a 3D point is inside a sphere (using squared distance, avoids sqrt).
52
+ /// @since 1.0.0
53
+ /// @param px Point X
54
+ /// @param py Point Y
55
+ /// @param pz Point Z
56
+ /// @param cx Sphere center X
57
+ /// @param cy Sphere center Y
58
+ /// @param cz Sphere center Z
59
+ /// @param r Sphere radius (same unit as coordinates)
60
+ /// @returns 1 if point is within the sphere, 0 otherwise
61
+ /// @example
62
+ /// let hit: int = sphere_contains(10, 64, 10, 0, 64, 0, 15)
36
63
  fn sphere_contains(px: int, py: int, pz: int,
37
64
  cx: int, cy: int, cz: int,
38
65
  r: int): int {
@@ -44,8 +71,16 @@ fn sphere_contains(px: int, py: int, pz: int,
44
71
  return 0;
45
72
  }
46
73
 
47
- // cylinder_contains(px, pz, cx, cz, r):
48
- // Returns 1 if point is inside vertical cylinder (ignores Y). 2D circle check.
74
+ /// Test whether a 2D point (XZ plane) is inside a vertical cylinder (ignores Y).
75
+ /// @since 1.0.0
76
+ /// @param px Point X
77
+ /// @param pz Point Z
78
+ /// @param cx Cylinder center X
79
+ /// @param cz Cylinder center Z
80
+ /// @param r Cylinder radius
81
+ /// @returns 1 if (px, pz) is within the cylinder's cross-section, 0 otherwise
82
+ /// @example
83
+ /// let in_zone: int = cylinder_contains(5, 5, 0, 0, 8)
49
84
  fn cylinder_contains(px: int, pz: int, cx: int, cz: int, r: int): int {
50
85
  let dx: int = px - cx;
51
86
  let dz: int = pz - cz;
@@ -61,28 +96,49 @@ fn cylinder_contains(px: int, pz: int, cx: int, cz: int, r: int): int {
61
96
  //
62
97
  // All values × 100 (1 block = 100 units), time in ticks.
63
98
 
64
- // parabola_y(y0, vy0, t): Y position at tick t.
65
- // y0: initial Y × 100, vy0: initial Y velocity × 100 (blocks/tick × 100)
66
- // gravity: 5 units/tick² (= 0.05 blocks/tick² × 100)
99
+ /// Compute Y position of a projectile along a parabolic arc at tick t.
100
+ /// @since 1.0.0
101
+ /// @param y0 Initial Y ×100
102
+ /// @param vy0 Initial Y velocity ×100 (blocks/tick × 100)
103
+ /// @param t Tick index
104
+ /// @returns y0 + vy0*t - 5*t²/2 (gravity = 5 units/tick² = 0.05 blocks/tick²×100)
105
+ /// @example
106
+ /// let y: int = parabola_y(6400, 100, 10) // at tick 10, v0=1 block/tick
67
107
  fn parabola_y(y0: int, vy0: int, t: int): int {
68
108
  return y0 + vy0 * t - 5 * t * t / 2;
69
109
  }
70
110
 
71
- // parabola_x(x0, vx0, t): horizontal X position at tick t (no drag, constant).
111
+ /// Compute horizontal X position along a parabolic path (constant velocity).
112
+ /// @since 1.0.0
113
+ /// @param x0 Initial X ×100
114
+ /// @param vx0 Horizontal X velocity ×100
115
+ /// @param t Tick index
116
+ /// @returns x0 + vx0*t
117
+ /// @example
118
+ /// let x: int = parabola_x(0, 50, 10) // 0 + 50*10 = 500
72
119
  fn parabola_x(x0: int, vx0: int, t: int): int {
73
120
  return x0 + vx0 * t;
74
121
  }
75
122
 
76
- // parabola_land_t(vy0): approximate tick when projectile returns to Y=0.
77
- // t_land ≈ 2 * vy0 / gravity = 2 * vy0 / 5 (in fixed-point units)
123
+ /// Estimate the tick when a projectile launched upward returns to Y=0.
124
+ /// @since 1.0.0
125
+ /// @param vy0 Initial upward Y velocity ×100
126
+ /// @returns Approximate landing tick: 2 * vy0 / 5
127
+ /// @example
128
+ /// let land: int = parabola_land_t(100) // tick when projectile lands
78
129
  fn parabola_land_t(vy0: int): int {
79
130
  return 2 * vy0 / 5;
80
131
  }
81
132
 
82
133
  // ─── Grid / tile math ────────────────────────────────────────────────────────
83
134
 
84
- // tile_of(coord): which tile a coordinate belongs to (floor division).
85
- // tile_of(250, 100) = 2 (block 2 when tile size = 100)
135
+ /// Compute which tile a coordinate falls in (floor division, handles negatives).
136
+ /// @since 1.0.0
137
+ /// @param coord Coordinate value (any unit)
138
+ /// @param tile_size Size of each tile in the same unit
139
+ /// @returns Floor-divided tile index (correct for negative coordinates)
140
+ /// @example
141
+ /// let tile: int = tile_of(250, 100) // result: 2 (tile index 2)
86
142
  fn tile_of(coord: int, tile_size: int): int {
87
143
  if (coord >= 0) {
88
144
  return coord / tile_size;
@@ -90,14 +146,25 @@ fn tile_of(coord: int, tile_size: int): int {
90
146
  return (coord - tile_size + 1) / tile_size;
91
147
  }
92
148
 
93
- // tile_center(tile, tile_size): center coordinate of a tile
149
+ /// Compute the center coordinate of a tile.
150
+ /// @since 1.0.0
151
+ /// @param tile Tile index
152
+ /// @param tile_size Size of each tile
153
+ /// @returns tile * tile_size + tile_size / 2
154
+ /// @example
155
+ /// let c: int = tile_center(2, 100) // result: 250 (center of tile 2)
94
156
  fn tile_center(tile: int, tile_size: int): int {
95
157
  return tile * tile_size + tile_size / 2;
96
158
  }
97
159
 
98
160
  // ─── Angle helpers ────────────────────────────────────────────────────────────
99
161
 
100
- // angle_normalize(deg): normalize angle to [0, 3600000) (degrees × 10000)
162
+ /// Normalize an angle (degrees ×10000) to the range [0, 3600000).
163
+ /// @since 1.0.0
164
+ /// @param deg Angle in degrees ×10000 (may be negative or >= 360°)
165
+ /// @returns Equivalent angle in [0, 3600000)
166
+ /// @example
167
+ /// let a: int = angle_normalize(-900000) // result: 2700000 (270°)
101
168
  fn angle_normalize(deg: int): int {
102
169
  let a: int = deg;
103
170
  while (a < 0) { a = a + 3600000; }
@@ -105,8 +172,13 @@ fn angle_normalize(deg: int): int {
105
172
  return a;
106
173
  }
107
174
 
108
- // angle_diff(a, b): signed shortest angular difference (degrees × 10000)
109
- // Result in (-1800000, 1800000]
175
+ /// Compute the signed shortest angular difference between two angles (degrees ×10000).
176
+ /// @since 1.0.0
177
+ /// @param a Starting angle ×10000
178
+ /// @param b Target angle ×10000
179
+ /// @returns Signed difference in (-1800000, 1800000] (shortest arc b - a)
180
+ /// @example
181
+ /// let diff: int = angle_diff(3500000, 100000) // ≈ -3400000 → wraps to short arc
110
182
  fn angle_diff(a: int, b: int): int {
111
183
  let d: int = angle_normalize(b - a);
112
184
  if (d > 1800000) { d = d - 3600000; }
@@ -115,8 +187,12 @@ fn angle_diff(a: int, b: int): int {
115
187
 
116
188
  // ─── Sun angle helper ────────────────────────────────────────────────────────
117
189
 
118
- // mc_day_angle(daytime): MC sun angle × 10000 from /time query daytime
119
- // Daytime 0 = dawn (sun at east = 90°), 6000 = noon (sun at south = 180°)
190
+ /// Convert Minecraft daytime ticks to sun angle in degrees ×10000.
191
+ /// @since 1.0.0
192
+ /// @param daytime /time query daytime value (0-23999; 0=dawn, 6000=noon)
193
+ /// @returns Sun angle in [0, 3600000) degrees ×10000
194
+ /// @example
195
+ /// let sun: int = mc_day_angle(6000) // noon → 1800000 (180°)
120
196
  fn mc_day_angle(daytime: int): int {
121
197
  // MC daytime: 0-24000 ticks per day
122
198
  // Sun angle = (daytime * 360 / 24000 + 90) mod 360
@@ -128,11 +204,19 @@ fn mc_day_angle(daytime: int): int {
128
204
  // All coordinates in ×10000 fixed-point units (1.0 block = 10000 units).
129
205
  // Angles for in_sector_2d in ×10000 radians (2π ≈ 628318).
130
206
 
131
- // in_cylinder(px,py,pz, cx,cz, radius, y_lo,y_hi):
132
- // Returns 1 if (px,py,pz) is inside a vertical cylinder centred at (cx,*,cz).
133
- // Condition: dx²+dz² <= r² AND y_lo <= py <= y_hi
134
- // Note: radius up to ~46340 (×10000 units ≈ 4.6 blocks) avoids overflow.
135
- // For larger radii, divide all coords by 10 first.
207
+ /// Test whether a point is inside a vertical cylinder (XZ circle with Y bounds).
208
+ /// @since 1.0.0
209
+ /// @param px Point X ×10000
210
+ /// @param py Point Y ×10000
211
+ /// @param pz Point Z ×10000
212
+ /// @param cx Cylinder center X ×10000
213
+ /// @param cz Cylinder center Z ×10000
214
+ /// @param radius Cylinder radius ×10000 (keep ≤ 46340 to avoid overflow)
215
+ /// @param y_lo Y lower bound ×10000 (inclusive)
216
+ /// @param y_hi Y upper bound ×10000 (inclusive)
217
+ /// @returns 1 if point is inside the cylinder, 0 otherwise
218
+ /// @example
219
+ /// let hit: int = in_cylinder(100000, 640000, 100000, 0, 0, 80000, 600000, 800000)
136
220
  fn in_cylinder(px: int, py: int, pz: int,
137
221
  cx: int, cz: int,
138
222
  radius: int,
@@ -145,12 +229,20 @@ fn in_cylinder(px: int, py: int, pz: int,
145
229
  return 0;
146
230
  }
147
231
 
148
- // in_cone(px,py,pz, apex_x,apex_y,apex_z, dir_y, half_angle_tan, height):
149
- // Returns 1 if point is inside an upright cone (axis along +Y from apex).
150
- // half_angle_tan = tan(half-angle) × 10000 (e.g. 45° → 10000, 30° → 5773).
151
- // Condition: 0 <= dy <= height AND horiz_dist <= dy * half_angle_tan / 10000
152
- // Both sides are compared squared to avoid sqrt:
153
- // (dx²+dz²) * 10000² <= (dy * half_angle_tan)²
232
+ /// Test whether a point is inside an upright cone (axis along +Y or -Y from apex).
233
+ /// @since 1.0.0
234
+ /// @param px Point X ×10000
235
+ /// @param py Point Y ×10000
236
+ /// @param pz Point Z ×10000
237
+ /// @param apex_x Cone apex X ×10000
238
+ /// @param apex_y Cone apex Y ×10000
239
+ /// @param apex_z Cone apex Z ×10000
240
+ /// @param dir_y Cone direction: positive = upward, negative = downward
241
+ /// @param half_angle_tan tan(half-angle) ×10000 (45° = 10000, 30° = 5773)
242
+ /// @param height Cone height ×10000
243
+ /// @returns 1 if point is inside the cone, 0 otherwise
244
+ /// @example
245
+ /// let hit: int = in_cone(px, py, pz, apex_x, apex_y, apex_z, 1, 10000, 50000)
154
246
  fn in_cone(px: int, py: int, pz: int,
155
247
  apex_x: int, apex_y: int, apex_z: int,
156
248
  dir_y: int, half_angle_tan: int, height: int): int {
@@ -178,12 +270,18 @@ fn in_cone(px: int, py: int, pz: int,
178
270
  return 0;
179
271
  }
180
272
 
181
- // in_sector_2d(px,pz, cx,cz, dir_angle, half_angle, radius):
182
- // Returns 1 if (px,pz) is inside a 2D fan (sector) in the XZ plane.
183
- // dir_angle: centre direction in ×10000 radians (0 = +X axis, 628318 = 2π).
184
- // half_angle: half-width of sector in ×10000 radians.
185
- // radius: maximum distance in same units as px/pz/cx/cz.
186
- // Uses atan2_fixed (returns integer degrees) converted to ×10000 radians.
273
+ /// Test whether a 2D point is inside a sector (pie-slice) in the XZ plane.
274
+ /// @since 1.0.0
275
+ /// @param px Point X ×10000
276
+ /// @param pz Point Z ×10000
277
+ /// @param cx Sector center X ×10000
278
+ /// @param cz Sector center Z ×10000
279
+ /// @param dir_angle Sector center direction in ×10000 radians (0 = +X, 628318 = 2π)
280
+ /// @param half_angle Half-width of sector in ×10000 radians
281
+ /// @param radius Maximum radius (same units as px, pz)
282
+ /// @returns 1 if point is within the sector, 0 otherwise
283
+ /// @example
284
+ /// let hit: int = in_sector_2d(px, pz, 0, 0, 0, 157079, 100000) // quarter-circle facing +X
187
285
  fn in_sector_2d(px: int, pz: int,
188
286
  cx: int, cz: int,
189
287
  dir_angle: int, half_angle: int,
@@ -29,6 +29,11 @@ module library
29
29
 
30
30
  // ─── Helpers ─────────────────────────────────────────────────────────────────
31
31
 
32
+ /// Check whether a node index is valid for this graph.
33
+ /// @since 1.0.0
34
+ /// @param g Graph array (from graph_new)
35
+ /// @param node Node index to validate
36
+ /// @returns 1 if node is in [0, node_count), 0 otherwise
32
37
  fn graph_is_valid_node(g: int[], node: int): int {
33
38
  if (node < 0) { return 0 }
34
39
  if (node >= g[1]) { return 0 }
@@ -37,6 +42,12 @@ fn graph_is_valid_node(g: int[], node: int): int {
37
42
 
38
43
  // ─── Construction ────────────────────────────────────────────────────────────
39
44
 
45
+ /// Create a new empty graph with n nodes and capacity for 256 directed edges.
46
+ /// @since 1.0.0
47
+ /// @param n Number of nodes (clamped to [0, 64])
48
+ /// @returns Initialized graph int[] with g[0]=0 (edges), g[1]=n (nodes)
49
+ /// @example
50
+ /// let g: int[] = graph_new(5) // graph with 5 nodes, no edges
40
51
  fn graph_new(n: int): int[] {
41
52
  if (n < 0) { n = 0 }
42
53
  if (n > 64) { n = 64 }
@@ -45,6 +56,15 @@ fn graph_new(n: int): int[] {
45
56
  return g
46
57
  }
47
58
 
59
+ /// Add a directed weighted edge to the graph.
60
+ /// @since 1.0.0
61
+ /// @param g Graph array
62
+ /// @param src Source node index
63
+ /// @param dst Destination node index
64
+ /// @param weight Edge weight (use 1 for unweighted graphs)
65
+ /// @returns Updated graph array; silently ignores invalid nodes or full edge list
66
+ /// @example
67
+ /// g = graph_add_edge(g, 0, 1, 5) // edge from 0 to 1 with weight 5
48
68
  fn graph_add_edge(g: int[], src: int, dst: int, weight: int): int[] {
49
69
  let e: int = g[0]
50
70
  if (e >= 256) { return g }
@@ -58,6 +78,15 @@ fn graph_add_edge(g: int[], src: int, dst: int, weight: int): int[] {
58
78
  return g
59
79
  }
60
80
 
81
+ /// Add an undirected weighted edge (adds both a→b and b→a directed edges).
82
+ /// @since 1.0.0
83
+ /// @param g Graph array
84
+ /// @param a First node index
85
+ /// @param b Second node index
86
+ /// @param weight Edge weight
87
+ /// @returns Updated graph array with two directed edges added
88
+ /// @example
89
+ /// g = graph_add_undirected(g, 2, 3, 2) // bidirectional edge between 2 and 3
61
90
  fn graph_add_undirected(g: int[], a: int, b: int, weight: int): int[] {
62
91
  g = graph_add_edge(g, a, b, weight)
63
92
  g = graph_add_edge(g, b, a, weight)
@@ -66,12 +95,29 @@ fn graph_add_undirected(g: int[], a: int, b: int, weight: int): int[] {
66
95
 
67
96
  // ─── Metadata ────────────────────────────────────────────────────────────────
68
97
 
98
+ /// Return the number of nodes in the graph.
99
+ /// @since 1.0.0
100
+ /// @param g Graph array
101
+ /// @returns Node count (g[1])
69
102
  fn graph_node_count(g: int[]): int { return g[1] }
70
103
 
104
+ /// Return the number of directed edges in the graph.
105
+ /// @since 1.0.0
106
+ /// @param g Graph array
107
+ /// @returns Edge count (g[0])
71
108
  fn graph_edge_count(g: int[]): int { return g[0] }
72
109
 
73
110
  // ─── Traversal ───────────────────────────────────────────────────────────────
74
111
 
112
+ /// Breadth-first search from a start node, returning visit order.
113
+ /// @since 1.0.0
114
+ /// @param g Graph array
115
+ /// @param start Starting node index
116
+ /// @param out_visited int[] of length >= node_count; cells set to 1 for visited nodes
117
+ /// @returns int[] of node indices in BFS visit order; empty if start is invalid
118
+ /// @example
119
+ /// let vis: int[] = [0, 0, 0, 0, 0]
120
+ /// let order: int[] = graph_bfs(g, 0, vis)
75
121
  fn graph_bfs(g: int[], start: int, out_visited: int[]): int[] {
76
122
  let order: int[] = []
77
123
  if (graph_is_valid_node(g, start) == 0) { return order }
@@ -112,6 +158,15 @@ fn graph_bfs(g: int[], start: int, out_visited: int[]): int[] {
112
158
  return order
113
159
  }
114
160
 
161
+ /// Depth-first search from a start node, returning visit order.
162
+ /// @since 1.0.0
163
+ /// @param g Graph array
164
+ /// @param start Starting node index
165
+ /// @param out_visited int[] of length >= node_count; cells set to 1 for visited nodes
166
+ /// @returns int[] of node indices in DFS visit order (iterative, stack-based)
167
+ /// @example
168
+ /// let vis: int[] = [0, 0, 0, 0, 0]
169
+ /// let order: int[] = graph_dfs(g, 0, vis)
115
170
  fn graph_dfs(g: int[], start: int, out_visited: int[]): int[] {
116
171
  let order: int[] = []
117
172
  if (graph_is_valid_node(g, start) == 0) { return order }
@@ -149,6 +204,14 @@ fn graph_dfs(g: int[], start: int, out_visited: int[]): int[] {
149
204
  return order
150
205
  }
151
206
 
207
+ /// Check whether a path exists between two nodes using BFS.
208
+ /// @since 1.0.0
209
+ /// @param g Graph array
210
+ /// @param src Source node index
211
+ /// @param dst Destination node index
212
+ /// @returns 1 if a directed path from src to dst exists, 0 otherwise
213
+ /// @example
214
+ /// let reachable: int = graph_has_path(g, 0, 3)
152
215
  fn graph_has_path(g: int[], src: int, dst: int): int {
153
216
  if (graph_is_valid_node(g, src) == 0) { return 0 }
154
217
  if (graph_is_valid_node(g, dst) == 0) { return 0 }
@@ -193,6 +256,16 @@ fn graph_has_path(g: int[], src: int, dst: int): int {
193
256
 
194
257
  // ─── Shortest paths ──────────────────────────────────────────────────────────
195
258
 
259
+ /// Find the shortest weighted path from src to all nodes using Dijkstra's algorithm.
260
+ /// @since 1.0.0
261
+ /// @param g Graph array
262
+ /// @param src Source node index
263
+ /// @param dst Destination node index (for return value)
264
+ /// @param out_dist int[] of length >= node_count; filled with shortest distances (-1 if unreachable)
265
+ /// @returns Shortest distance from src to dst, or -1 if unreachable
266
+ /// @example
267
+ /// let dist: int[] = [0, 0, 0, 0, 0]
268
+ /// let d: int = graph_shortest_path(g, 0, 3, dist)
196
269
  fn graph_shortest_path(g: int[], src: int, dst: int, out_dist: int[]): int {
197
270
  let n: int = g[1]
198
271
  if (graph_is_valid_node(g, src) == 0) { return -1 }