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,123 @@
1
+ // queue.mcrs — NBT-backed FIFO queue for RedScript datapacks.
2
+ //
3
+ // The queue is stored in `storage rs:arrays Queue` as an int list.
4
+ // A scoreboard objective `rs.q_head` tracks the logical head index so that
5
+ // dequeue is O(1) (we never physically shift elements; the head pointer just
6
+ // advances). queue_clear resets both the list and the head pointer to 0.
7
+ //
8
+ // Storage layout:
9
+ // rs:arrays { Queue: [10, 20, 30] } ← raw backing list
10
+ // scoreboard rs.q_head <global> ← index of the next element to pop
11
+
12
+ module library;
13
+
14
+ // ─── Internal macro helpers ──────────────────────────────────────────────────
15
+
16
+ fn __queue_append_apply() {
17
+ raw("$data modify storage rs:arrays Queue append value $(val)");
18
+ }
19
+
20
+ fn __queue_peek_apply() {
21
+ raw("$execute store result score $ret __OBJ__ run data get storage rs:arrays Queue[$(idx)]");
22
+ }
23
+
24
+ fn __queue_size_raw_apply() {
25
+ raw("$execute store result score $ret __OBJ__ run data get storage rs:arrays Queue");
26
+ }
27
+
28
+ // ─── Public API ──────────────────────────────────────────────────────────────
29
+
30
+ /// Enqueue a value into the queue.
31
+ ///
32
+ /// The value is appended to the end of `storage rs:arrays Queue`.
33
+ ///
34
+ /// @since 3.0.0
35
+ /// @param val Value to enqueue
36
+ /// @example
37
+ /// queue_push(42)
38
+ fn queue_push(val: int) {
39
+ raw("execute store result storage rs:macro_args val int 1 run scoreboard players get $p0 __OBJ__");
40
+ raw("function __NS__:__queue_append_apply with storage rs:macro_args");
41
+ }
42
+
43
+ /// Dequeue and return the front value.
44
+ ///
45
+ /// Advances the head pointer by one. If the queue is empty, returns `-1`.
46
+ ///
47
+ /// @since 3.0.0
48
+ /// @returns Front value, or -1 if empty
49
+ /// @example
50
+ /// let v: int = queue_pop()
51
+ fn queue_pop(): int {
52
+ // Check empty
53
+ let empty: int = queue_empty();
54
+ if (empty == 1) { return -1; }
55
+
56
+ // Read front element
57
+ raw("scoreboard players set $ret __OBJ__ 0");
58
+ raw("execute store result storage rs:macro_args idx int 1 run scoreboard players get rs.q_head __RS__");
59
+ raw("function __NS__:__queue_peek_apply with storage rs:macro_args");
60
+ // Advance head pointer
61
+ raw("scoreboard players add rs.q_head __RS__ 1");
62
+ raw("return 1");
63
+ return 0;
64
+ }
65
+
66
+ /// Peek at the front value without removing it.
67
+ ///
68
+ /// If the queue is empty, returns `-1`.
69
+ ///
70
+ /// @since 3.0.0
71
+ /// @returns Front value, or -1 if empty
72
+ /// @example
73
+ /// let front: int = queue_peek()
74
+ fn queue_peek(): int {
75
+ let empty: int = queue_empty();
76
+ if (empty == 1) { return -1; }
77
+
78
+ raw("scoreboard players set $ret __OBJ__ 0");
79
+ raw("execute store result storage rs:macro_args idx int 1 run scoreboard players get rs.q_head __RS__");
80
+ raw("function __NS__:__queue_peek_apply with storage rs:macro_args");
81
+ raw("return 1");
82
+ return 0;
83
+ }
84
+
85
+ /// Get the number of elements in the queue.
86
+ ///
87
+ /// This is the count of un-popped elements: `raw_size - head`.
88
+ ///
89
+ /// @since 3.0.0
90
+ /// @returns Queue size
91
+ /// @example
92
+ /// let n: int = queue_size()
93
+ fn queue_size(): int {
94
+ raw("scoreboard players set $ret __OBJ__ 0");
95
+ raw("function __NS__:__queue_size_raw_apply with storage rs:macro_args");
96
+ raw("scoreboard players operation $ret __OBJ__ -= rs.q_head __RS__");
97
+ raw("return 1");
98
+ return 0;
99
+ }
100
+
101
+ /// Check if the queue is empty.
102
+ ///
103
+ /// @since 3.0.0
104
+ /// @returns 1 if empty, 0 otherwise
105
+ /// @example
106
+ /// if (queue_empty() == 1) { }
107
+ fn queue_empty(): int {
108
+ let sz: int = queue_size();
109
+ if (sz <= 0) { return 1; }
110
+ return 0;
111
+ }
112
+
113
+ /// Clear all elements from the queue.
114
+ ///
115
+ /// Resets `storage rs:arrays Queue` to an empty list and the head pointer to 0.
116
+ ///
117
+ /// @since 3.0.0
118
+ /// @example
119
+ /// queue_clear()
120
+ fn queue_clear() {
121
+ raw("data modify storage rs:arrays Queue set value []");
122
+ raw("scoreboard players set rs.q_head __RS__ 0");
123
+ }
@@ -12,21 +12,41 @@
12
12
 
13
13
  module library;
14
14
 
15
- // next_lcg(seed): advance LCG state, return next pseudo-random int32.
16
- // The returned value is also the new seed for the next call.
15
+ /// Advance the LCG state by one step, returning the next pseudo-random int32.
16
+ /// The returned value is also the new seed for the next call.
17
+ /// @since 1.0.0
18
+ /// @param seed Current LCG state (any non-zero integer to start)
19
+ /// @returns Next pseudo-random int32 (also serves as next seed)
20
+ /// @example
21
+ /// let seed: int = 12345
22
+ /// seed = next_lcg(seed)
23
+ /// seed = next_lcg(seed) // advance two steps
17
24
  fn next_lcg(seed: int): int {
18
25
  return seed * 1664525 + 1013904223;
19
26
  }
20
27
 
21
- // random_range(seed, lo, hi): return integer in [lo, hi).
22
- // seed should already be the output of next_lcg.
28
+ /// Generate a pseudo-random integer in the range [lo, hi).
29
+ /// @since 1.0.0
30
+ /// @param seed LCG output value (result of next_lcg)
31
+ /// @param lo Inclusive lower bound
32
+ /// @param hi Exclusive upper bound (must be > lo)
33
+ /// @returns Integer in [lo, hi)
34
+ /// @example
35
+ /// seed = next_lcg(seed)
36
+ /// let roll: int = random_range(seed, 1, 7) // dice roll: 1-6
23
37
  fn random_range(seed: int, lo: int, hi: int): int {
24
38
  let r: int = seed;
25
39
  if (r < 0) { r = 0 - r; }
26
40
  return lo + r % (hi - lo);
27
41
  }
28
42
 
29
- // random_bool(seed): return 0 or 1 with equal probability.
43
+ /// Generate a pseudo-random boolean (0 or 1) with equal probability.
44
+ /// @since 1.0.0
45
+ /// @param seed LCG output value (result of next_lcg)
46
+ /// @returns 0 or 1 with ~50% probability each
47
+ /// @example
48
+ /// seed = next_lcg(seed)
49
+ /// let coin: int = random_bool(seed) // 0 or 1
30
50
  fn random_bool(seed: int): int {
31
51
  let r: int = seed;
32
52
  if (r < 0) { r = 0 - r; }
@@ -44,19 +64,34 @@ fn random_bool(seed: int): int {
44
64
  //
45
65
  // Usage: maintain two state variables (hi, lo); update both each call.
46
66
 
47
- // pcg_next_lo(state_lo, state_hi): advance PCG state (low word).
48
- // Returns new low word. Use with pcg_next_hi.
67
+ /// Advance the PCG low-word state by one step.
68
+ /// Call together with pcg_next_hi; use pcg_output to extract the random value.
69
+ /// @since 1.0.0
70
+ /// @param state_lo Current low word of PCG state
71
+ /// @returns New low word
72
+ /// @example
73
+ /// let lo: int = pcg_next_lo(state_lo)
49
74
  fn pcg_next_lo(state_lo: int): int {
50
75
  return state_lo * 747796405 + -1403630843;
51
76
  }
52
77
 
53
- // pcg_next_hi(state_lo, state_hi): advance PCG state (high word).
78
+ /// Advance the PCG high-word state by one step.
79
+ /// @since 1.0.0
80
+ /// @param state_hi Current high word of PCG state
81
+ /// @param state_lo Current low word of PCG state (previous, before pcg_next_lo)
82
+ /// @returns New high word
83
+ /// @example
84
+ /// let hi: int = pcg_next_hi(state_hi, state_lo)
54
85
  fn pcg_next_hi(state_hi: int, state_lo: int): int {
55
86
  return state_hi * 747796405 + state_lo;
56
87
  }
57
88
 
58
- // pcg_output(state_lo): extract output value from PCG low word.
59
- // Applies XSH-RR output permutation (simplified to XOR-shift).
89
+ /// Extract an output value from the PCG low word using XSH-RR permutation.
90
+ /// @since 1.0.0
91
+ /// @param state_lo Current low word of PCG state (after pcg_next_lo)
92
+ /// @returns Pseudo-random output value (unsigned, any int)
93
+ /// @example
94
+ /// let rng: int = pcg_output(state_lo)
60
95
  fn pcg_output(state_lo: int): int {
61
96
  let xsh: int = state_lo;
62
97
  // xsh = ((state >> 18) ^ state) >> 27 (simplified: use single xor-shift)
@@ -79,10 +114,14 @@ fn _binom_loop(n: int, p: int, seed: int, acc: int): int {
79
114
  return _binom_loop(n - 1, p, s2, acc + hit);
80
115
  }
81
116
 
82
- // binomial_sample(n, p_x10000, seed): count successes in n Bernoulli trials
83
- // p_x10000: probability ×10000 (e.g. 5000 = 0.5 = 50%)
84
- // seed: LCG seed (any non-zero int)
85
- // Returns: number of successes [0, n]
117
+ /// Simulate n Bernoulli trials and count the number of successes (binomial distribution).
118
+ /// @since 1.0.0
119
+ /// @param n Number of trials
120
+ /// @param p_x10000 Success probability ×10000 (e.g. 5000 = 50%, 3000 = 30%)
121
+ /// @param seed LCG seed (any non-zero integer)
122
+ /// @returns Number of successes in [0, n]
123
+ /// @example
124
+ /// let hits: int = binomial_sample(10, 5000, 99999) // ~5 successes on average
86
125
  fn binomial_sample(n: int, p_x10000: int, seed: int): int {
87
126
  return _binom_loop(n, p_x10000, seed, 0);
88
127
  }
@@ -103,10 +142,16 @@ fn _hyper_loop(rem_pop: int, rem_succ: int, draws: int, seed: int, acc: int): in
103
142
  return _hyper_loop(rem_pop - 1, rem_succ - success, draws - 1, s2, acc + success);
104
143
  }
105
144
 
106
- // hypergeometric_sample(pop_size, success_states, draws, seed):
107
- // Simulate drawing `draws` items without replacement from a population of `pop_size`
108
- // items of which `success_states` are successes.
109
- // seed: LCG seed. Returns: number of successes drawn [0, min(draws, success_states)].
145
+ /// Draw `draws` items without replacement from a population and count successes (hypergeometric distribution).
146
+ /// @since 1.0.0
147
+ /// @param pop_size Total population size
148
+ /// @param success_states Number of "success" items in the population
149
+ /// @param draws Number of items to draw
150
+ /// @param seed LCG seed (any non-zero integer)
151
+ /// @returns Number of successes drawn, in [0, min(draws, success_states)]
152
+ /// @example
153
+ /// // 52-card deck, 4 aces, draw 5 cards
154
+ /// let aces: int = hypergeometric_sample(52, 4, 5, 42)
110
155
  fn hypergeometric_sample(pop_size: int, success_states: int, draws: int, seed: int): int {
111
156
  return _hyper_loop(pop_size, success_states, draws, seed, 0);
112
157
  }
@@ -0,0 +1,111 @@
1
+ // result.mcrs — Result<T> type for error handling in RedScript datapacks.
2
+ //
3
+ // Result<T> wraps either a successful value (Ok) or an error code (Err).
4
+ // This is useful in Minecraft datapacks for operations that may fail,
5
+ // such as division, inventory checks, or entity lookups.
6
+ //
7
+ // Usage:
8
+ // let r = divide(10, 2)
9
+ // match r {
10
+ // Result::Ok(value) => { /* use value */ }
11
+ // Result::Err(code) => { /* handle error code */ }
12
+ // }
13
+ //
14
+ // Error codes are integers; use negative values for errors by convention:
15
+ // -1 = generic error
16
+ // -2 = division by zero
17
+ // -3 = not found
18
+ // etc.
19
+
20
+ module library;
21
+
22
+ // ─── Result<T> enum ───────────────────────────────────────────────────────────
23
+
24
+ enum Result {
25
+ Ok(value: int),
26
+ Err(code: int),
27
+ }
28
+
29
+ // ─── Constructor helpers ──────────────────────────────────────────────────────
30
+
31
+ /// Construct a successful Result with the given value.
32
+ /// @since 1.0.0
33
+ /// @param value The success value (any integer)
34
+ /// @returns Result::Ok(value)
35
+ /// @example
36
+ /// let r = result_ok(42) // Ok result carrying 42
37
+ fn result_ok(value: int): Result {
38
+ return Result::Ok(value: value);
39
+ }
40
+
41
+ /// Construct a failed Result with the given error code.
42
+ /// @since 1.0.0
43
+ /// @param code Error code (use negative by convention: -1 generic, -2 div/zero)
44
+ /// @returns Result::Err(code)
45
+ /// @example
46
+ /// let r = result_err(-2) // division-by-zero error
47
+ fn result_err(code: int): Result {
48
+ return Result::Err(code: code);
49
+ }
50
+
51
+ // ─── Query helpers ────────────────────────────────────────────────────────────
52
+
53
+ /// Returns 1 if the Result is Ok, 0 otherwise.
54
+ /// @since 1.0.0
55
+ /// @param r The Result to test
56
+ /// @returns 1 if Ok, 0 if Err
57
+ /// @example
58
+ /// let ok = result_is_ok(result_ok(5)) // result: 1
59
+ fn result_is_ok(r: Result): int {
60
+ match r {
61
+ Result::Ok(value) => { return 1; }
62
+ Result::Err(code) => { return 0; }
63
+ }
64
+ return 0;
65
+ }
66
+
67
+ /// Returns 1 if the Result is Err, 0 otherwise.
68
+ fn result_is_err(r: Result): int {
69
+ match r {
70
+ Result::Ok(value) => { return 0; }
71
+ Result::Err(code) => { return 1; }
72
+ }
73
+ return 0;
74
+ }
75
+
76
+ // ─── Extraction helpers ───────────────────────────────────────────────────────
77
+
78
+ /// Extract the value from an Ok result.
79
+ /// Returns 0 if the Result is Err (check result_is_ok first).
80
+ /// @since 1.0.0
81
+ /// @param r The Result to unwrap
82
+ /// @returns The Ok value, or 0 if Err
83
+ /// @example
84
+ /// let v = result_value(result_ok(99)) // result: 99
85
+ fn result_value(r: Result): int {
86
+ match r {
87
+ Result::Ok(value) => { return value; }
88
+ Result::Err(code) => { return 0; }
89
+ }
90
+ return 0;
91
+ }
92
+
93
+ /// Extract the error code from an Err result.
94
+ /// Returns 0 if the Result is Ok (check result_is_err first).
95
+ fn result_code(r: Result): int {
96
+ match r {
97
+ Result::Ok(value) => { return 0; }
98
+ Result::Err(code) => { return code; }
99
+ }
100
+ return 0;
101
+ }
102
+
103
+ // ─── Example: safe division ───────────────────────────────────────────────────
104
+
105
+ /// Divide a by b; returns Err(-2) on division by zero.
106
+ fn result_divide(a: int, b: int): Result {
107
+ if (b == 0) {
108
+ return Result::Err(code: -2);
109
+ }
110
+ return Result::Ok(value: a / b);
111
+ }
@@ -15,7 +15,14 @@ module library
15
15
 
16
16
  // ─── Per-player tasks ─────────────────────────────────────────────────────────
17
17
 
18
- /// Schedule slot task_id (0..7) to fire after `delay` ticks for player p.
18
+ /// Schedule slot `task_id` (07) to fire after `delay` ticks for player `p`.
19
+ ///
20
+ /// @since 1.0.0
21
+ /// @param p Recipient player or entity selector
22
+ /// @param task_id Slot index in range [0, 7]
23
+ /// @param delay Number of ticks to wait before firing
24
+ /// @example
25
+ /// task_schedule(@s, 0, 40)
19
26
  fn task_schedule(p: selector, task_id: int, delay: int) {
20
27
  if (task_id == 0) {
21
28
  scoreboard_set(p, "rs.t0", delay);
@@ -48,7 +55,13 @@ fn task_schedule(p: selector, task_id: int, delay: int) {
48
55
  }
49
56
  }
50
57
 
51
- /// Cancel slot task_id for player p (zeroes the counter).
58
+ /// Cancel slot `task_id` for player `p` (zeroes the counter).
59
+ ///
60
+ /// @since 1.0.0
61
+ /// @param p Recipient player or entity selector
62
+ /// @param task_id Slot index in range [0, 7]
63
+ /// @example
64
+ /// task_cancel(@s, 0)
52
65
  fn task_cancel(p: selector, task_id: int) {
53
66
  if (task_id == 0) {
54
67
  scoreboard_set(p, "rs.t0", 0);
@@ -81,8 +94,16 @@ fn task_cancel(p: selector, task_id: int) {
81
94
  }
82
95
  }
83
96
 
84
- /// Returns 1 if slot task_id is ready (counter reached 1 on last tick), 0 otherwise.
85
- /// Automatically clears the slot when ready.
97
+ /// Returns `1` if slot `task_id` fired on this tick (counter reached 1), `0` otherwise.
98
+ ///
99
+ /// Automatically clears the slot once it fires so subsequent calls return `0`.
100
+ ///
101
+ /// @since 1.0.0
102
+ /// @param p Player or entity selector to check
103
+ /// @param task_id Slot index in range [0, 7]
104
+ /// @returns `1` when the task is ready, `0` otherwise
105
+ /// @example
106
+ /// if (task_ready(@s, 0) == 1) { /* handle event */ }
86
107
  fn task_ready(p: selector, task_id: int) -> int {
87
108
  let val: int = 0;
88
109
  if (task_id == 0) {
@@ -123,7 +144,16 @@ fn task_ready(p: selector, task_id: int) -> int {
123
144
 
124
145
  // ─── Global tasks (bound to #rs fake-player) ──────────────────────────────────
125
146
 
126
- /// Schedule global slot task_id (0..7) to fire after `delay` ticks.
147
+ /// Schedule global slot `task_id` (07) to fire after `delay` ticks.
148
+ ///
149
+ /// Global tasks are stored on the `#rs` fake-player and are not bound to any
150
+ /// specific player entity.
151
+ ///
152
+ /// @since 1.0.0
153
+ /// @param task_id Slot index in range [0, 7]
154
+ /// @param delay Number of ticks to wait before firing
155
+ /// @example
156
+ /// gtask_schedule(0, 200)
127
157
  fn gtask_schedule(task_id: int, delay: int) {
128
158
  if (task_id == 0) {
129
159
  scoreboard_set("#rs", "rs.g0", delay);
@@ -156,7 +186,12 @@ fn gtask_schedule(task_id: int, delay: int) {
156
186
  }
157
187
  }
158
188
 
159
- /// Cancel global slot task_id.
189
+ /// Cancel global slot `task_id` by zeroing its counter.
190
+ ///
191
+ /// @since 1.0.0
192
+ /// @param task_id Slot index in range [0, 7]
193
+ /// @example
194
+ /// gtask_cancel(0)
160
195
  fn gtask_cancel(task_id: int) {
161
196
  if (task_id == 0) {
162
197
  scoreboard_set("#rs", "rs.g0", 0);
@@ -189,8 +224,15 @@ fn gtask_cancel(task_id: int) {
189
224
  }
190
225
  }
191
226
 
192
- /// Returns 1 if global slot task_id is ready, 0 otherwise.
193
- /// Automatically clears the slot when ready.
227
+ /// Returns `1` if global slot `task_id` fired this tick, `0` otherwise.
228
+ ///
229
+ /// Automatically clears the slot once it fires.
230
+ ///
231
+ /// @since 1.0.0
232
+ /// @param task_id Slot index in range [0, 7]
233
+ /// @returns `1` when the task is ready, `0` otherwise
234
+ /// @example
235
+ /// if (gtask_ready(0) == 1) { /* handle global event */ }
194
236
  fn gtask_ready(task_id: int) -> int {
195
237
  let val: int = 0;
196
238
  if (task_id == 0) {
@@ -231,8 +273,15 @@ fn gtask_ready(task_id: int) -> int {
231
273
 
232
274
  // ─── Tick driver ──────────────────────────────────────────────────────────────
233
275
 
234
- /// Decrement all active per-player timers by 1.
235
- /// Call this inside your @tick function (executed as @a).
276
+ /// Decrement all active per-player and global timers by 1 each tick.
277
+ ///
278
+ /// Call this inside your `@tick` function (executed as `@a`). Counters are
279
+ /// clamped to 0 so they never go negative.
280
+ ///
281
+ /// @since 1.0.0
282
+ /// @example
283
+ /// // In your @tick mcfunction:
284
+ /// scheduler_tick()
236
285
  fn scheduler_tick() {
237
286
  // Per-player slots
238
287
  raw("execute as @a run scoreboard players remove @s rs.t0 1");