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
@@ -21,9 +21,26 @@ module library;
21
21
 
22
22
  // ─── Static min/max/avg ──────────────────────────────────────────────────────
23
23
 
24
+ /// Return the smaller of two integers.
25
+ /// @since 1.0.0
26
+ /// @param a First value
27
+ /// @param b Second value
28
+ /// @returns a if a ≤ b, otherwise b
24
29
  fn sort2_min(a: int, b: int): int { if (a <= b) { return a; } return b; }
30
+
31
+ /// Return the larger of two integers.
32
+ /// @since 1.0.0
33
+ /// @param a First value
34
+ /// @param b Second value
35
+ /// @returns a if a ≥ b, otherwise b
25
36
  fn sort2_max(a: int, b: int): int { if (a >= b) { return a; } return b; }
26
37
 
38
+ /// Minimum of three integers.
39
+ /// @since 1.0.0
40
+ /// @param a First value
41
+ /// @param b Second value
42
+ /// @param c Third value
43
+ /// @returns The smallest of a, b, c
27
44
  fn list_min3(a: int, b: int, c: int): int {
28
45
  let m: int = a;
29
46
  if (b < m) { m = b; }
@@ -31,6 +48,12 @@ fn list_min3(a: int, b: int, c: int): int {
31
48
  return m;
32
49
  }
33
50
 
51
+ /// Maximum of three integers.
52
+ /// @since 1.0.0
53
+ /// @param a First value
54
+ /// @param b Second value
55
+ /// @param c Third value
56
+ /// @returns The largest of a, b, c
34
57
  fn list_max3(a: int, b: int, c: int): int {
35
58
  let m: int = a;
36
59
  if (b > m) { m = b; }
@@ -38,6 +61,14 @@ fn list_max3(a: int, b: int, c: int): int {
38
61
  return m;
39
62
  }
40
63
 
64
+ /// Minimum of five integers.
65
+ /// @since 1.0.0
66
+ /// @param a Value 1
67
+ /// @param b Value 2
68
+ /// @param c Value 3
69
+ /// @param d Value 4
70
+ /// @param e Value 5
71
+ /// @returns The smallest of the five inputs
41
72
  fn list_min5(a: int, b: int, c: int, d: int, e: int): int {
42
73
  let m: int = a;
43
74
  if (b < m) { m = b; }
@@ -47,6 +78,14 @@ fn list_min5(a: int, b: int, c: int, d: int, e: int): int {
47
78
  return m;
48
79
  }
49
80
 
81
+ /// Maximum of five integers.
82
+ /// @since 1.0.0
83
+ /// @param a Value 1
84
+ /// @param b Value 2
85
+ /// @param c Value 3
86
+ /// @param d Value 4
87
+ /// @param e Value 5
88
+ /// @returns The largest of the five inputs
50
89
  fn list_max5(a: int, b: int, c: int, d: int, e: int): int {
51
90
  let m: int = a;
52
91
  if (b > m) { m = b; }
@@ -56,15 +95,60 @@ fn list_max5(a: int, b: int, c: int, d: int, e: int): int {
56
95
  return m;
57
96
  }
58
97
 
98
+ /// Sum of five integers.
99
+ /// @since 1.0.0
100
+ /// @param a Value 1
101
+ /// @param b Value 2
102
+ /// @param c Value 3
103
+ /// @param d Value 4
104
+ /// @param e Value 5
105
+ /// @returns a + b + c + d + e
59
106
  fn list_sum5(a: int, b: int, c: int, d: int, e: int): int { return a + b + c + d + e; }
107
+
108
+ /// Sum of four integers.
109
+ /// @since 1.0.0
110
+ /// @param a Value 1
111
+ /// @param b Value 2
112
+ /// @param c Value 3
113
+ /// @param d Value 4
114
+ /// @returns a + b + c + d
60
115
  fn list_sum4(a: int, b: int, c: int, d: int): int { return a + b + c + d; }
116
+
117
+ /// Sum of three integers.
118
+ /// @since 1.0.0
119
+ /// @param a Value 1
120
+ /// @param b Value 2
121
+ /// @param c Value 3
122
+ /// @returns a + b + c
61
123
  fn list_sum3(a: int, b: int, c: int): int { return a + b + c; }
124
+
125
+ /// Integer average of three values (truncates toward zero).
126
+ /// @since 1.0.0
127
+ /// @param a Value 1
128
+ /// @param b Value 2
129
+ /// @param c Value 3
130
+ /// @returns (a + b + c) / 3
62
131
  fn avg3(a: int, b: int, c: int): int { return (a + b + c) / 3; }
132
+
133
+ /// Integer average of five values (truncates toward zero).
134
+ /// @since 1.0.0
135
+ /// @param a Value 1
136
+ /// @param b Value 2
137
+ /// @param c Value 3
138
+ /// @param d Value 4
139
+ /// @param e Value 5
140
+ /// @returns (a + b + c + d + e) / 5
63
141
  fn avg5(a: int, b: int, c: int, d: int, e: int): int { return (a + b + c + d + e) / 5; }
64
142
 
65
143
  // ─── Static sort (sorting network) ───────────────────────────────────────────
66
144
 
67
- // sort3(a, b, c, pos): return sorted value at position pos (0=min, 1=mid, 2=max)
145
+ /// Sort three values and return the one at position `pos` (0 = min, 1 = mid, 2 = max).
146
+ /// @since 1.0.0
147
+ /// @param a Value 1
148
+ /// @param b Value 2
149
+ /// @param c Value 3
150
+ /// @param pos Desired position in sorted order (0, 1, or 2)
151
+ /// @returns The value at the requested sorted position
68
152
  fn sort3(a: int, b: int, c: int, pos: int): int {
69
153
  let x: int = a; let y: int = b; let z: int = c;
70
154
  if (x > y) { let t: int = x; x = y; y = t; }
@@ -77,6 +161,12 @@ fn sort3(a: int, b: int, c: int, pos: int): int {
77
161
 
78
162
  // ─── Weighted random choice ───────────────────────────────────────────────────
79
163
 
164
+ /// Weighted random choice between two options (0 or 1) using an LCG seed.
165
+ /// @since 1.0.0
166
+ /// @param seed LCG seed (any integer)
167
+ /// @param w0 Weight for option 0 (must be > 0)
168
+ /// @param w1 Weight for option 1 (must be > 0)
169
+ /// @returns 0 with probability w0/(w0+w1), 1 otherwise
80
170
  fn weighted2(seed: int, w0: int, w1: int): int {
81
171
  let total: int = w0 + w1;
82
172
  let r: int = seed * 1664525 + 1013904223;
@@ -85,6 +175,13 @@ fn weighted2(seed: int, w0: int, w1: int): int {
85
175
  return 1;
86
176
  }
87
177
 
178
+ /// Weighted random choice among three options (0, 1, or 2) using an LCG seed.
179
+ /// @since 1.0.0
180
+ /// @param seed LCG seed (any integer)
181
+ /// @param w0 Weight for option 0
182
+ /// @param w1 Weight for option 1
183
+ /// @param w2 Weight for option 2
184
+ /// @returns 0, 1, or 2 proportional to the respective weights
88
185
  fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
89
186
  let total: int = w0 + w1 + w2;
90
187
  let r: int = seed * 1664525 + 1013904223;
@@ -97,8 +194,14 @@ fn weighted3(seed: int, w0: int, w1: int, w2: int): int {
97
194
 
98
195
  // ─── Sorting networks (fixed-size, optimal compare-swap count) ────────────────
99
196
 
100
- // sort4(a,b,c,d, pos): sort 4 values, return value at position pos (0=min)
101
- // Uses 5-comparison optimal sorting network
197
+ /// Sort four values using an optimal 5-comparison sorting network, returning the value at `pos`.
198
+ /// @since 1.0.0
199
+ /// @param a Value 1
200
+ /// @param b Value 2
201
+ /// @param c Value 3
202
+ /// @param d Value 4
203
+ /// @param pos Desired position in sorted order (0 = min, 3 = max)
204
+ /// @returns The value at the requested sorted position
102
205
  fn sort4(a: int, b: int, c: int, d: int, pos: int): int {
103
206
  let w: int = a; let x: int = b; let y: int = c; let z: int = d;
104
207
  // Sorting network for 4 elements
@@ -113,8 +216,15 @@ fn sort4(a: int, b: int, c: int, d: int, pos: int): int {
113
216
  return z;
114
217
  }
115
218
 
116
- // sort5(a,b,c,d,e, pos): sort 5 values, return value at position pos
117
- // Uses 9-comparison sorting network
219
+ /// Sort five values using a 9-comparison Batcher odd-even merge sort network, returning the value at `pos`.
220
+ /// @since 1.0.0
221
+ /// @param a Value 1
222
+ /// @param b Value 2
223
+ /// @param c Value 3
224
+ /// @param d Value 4
225
+ /// @param e Value 5
226
+ /// @param pos Desired position in sorted order (0 = min, 4 = max)
227
+ /// @returns The value at the requested sorted position
118
228
  fn sort5(a: int, b: int, c: int, d: int, e: int, pos: int): int {
119
229
  let v0: int = a; let v1: int = b; let v2: int = c; let v3: int = d; let v4: int = e;
120
230
  // 9-comparison sorting network (Batcher odd-even merge sort)
@@ -136,8 +246,11 @@ fn sort5(a: int, b: int, c: int, d: int, e: int, pos: int): int {
136
246
 
137
247
  // ─── Dynamic sort (arbitrary-length, uses array reference passing) ─────────────
138
248
 
139
- // list_sort_asc(arr, len): in-place ascending bubble sort
140
- // Requires RedScript ≥ 2.4.0 (array parameter by reference)
249
+ /// In-place ascending bubble sort for an array of any length.
250
+ /// Requires RedScript ≥ 2.4.0 (array parameter passed by reference).
251
+ /// @since 1.0.0
252
+ /// @param arr Array to sort (modified in-place)
253
+ /// @param len Number of elements to sort
141
254
  fn list_sort_asc(arr: int[], len: int) {
142
255
  let i: int = 0;
143
256
  while (i < len - 1) {
@@ -154,7 +267,11 @@ fn list_sort_asc(arr: int[], len: int) {
154
267
  }
155
268
  }
156
269
 
157
- // list_sort_desc(arr, len): in-place descending bubble sort
270
+ /// In-place descending bubble sort for an array of any length.
271
+ /// Requires RedScript ≥ 2.4.0 (array parameter passed by reference).
272
+ /// @since 1.0.0
273
+ /// @param arr Array to sort (modified in-place)
274
+ /// @param len Number of elements to sort
158
275
  fn list_sort_desc(arr: int[], len: int) {
159
276
  let i: int = 0;
160
277
  while (i < len - 1) {
@@ -173,7 +290,11 @@ fn list_sort_desc(arr: int[], len: int) {
173
290
 
174
291
  // ─── Dynamic array aggregates ─────────────────────────────────────────────────
175
292
 
176
- // list_sum(arr, len): sum of all elements
293
+ /// Sum all elements of an array.
294
+ /// @since 1.0.0
295
+ /// @param arr Input array
296
+ /// @param len Number of elements
297
+ /// @returns Sum of arr[0..len)
177
298
  fn list_sum(arr: int[], len: int): int {
178
299
  let s: int = 0;
179
300
  let i: int = 0;
@@ -184,15 +305,22 @@ fn list_sum(arr: int[], len: int): int {
184
305
  return s;
185
306
  }
186
307
 
187
- // list_avg(arr, len): arithmetic mean ×10000 (fixed-point)
188
- // Returns (sum * 10000) / len; returns 0 for empty array
308
+ /// Arithmetic mean of an array as fixed-point × 10000.
309
+ /// @since 1.0.0
310
+ /// @param arr Input array
311
+ /// @param len Number of elements (must be > 0)
312
+ /// @returns (sum × 10000) / len; returns 0 for empty array
189
313
  fn list_avg(arr: int[], len: int): int {
190
314
  if (len <= 0) { return 0; }
191
315
  let s: int = list_sum(arr, len);
192
316
  return s * 10000 / len;
193
317
  }
194
318
 
195
- // list_min(arr, len): minimum element in array
319
+ /// Minimum element in an array.
320
+ /// @since 1.0.0
321
+ /// @param arr Input array (must have at least one element)
322
+ /// @param len Number of elements
323
+ /// @returns Smallest value in arr[0..len)
196
324
  fn list_min(arr: int[], len: int): int {
197
325
  let m: int = arr[0];
198
326
  let i: int = 1;
@@ -203,7 +331,11 @@ fn list_min(arr: int[], len: int): int {
203
331
  return m;
204
332
  }
205
333
 
206
- // list_max(arr, len): maximum element in array
334
+ /// Maximum element in an array.
335
+ /// @since 1.0.0
336
+ /// @param arr Input array (must have at least one element)
337
+ /// @param len Number of elements
338
+ /// @returns Largest value in arr[0..len)
207
339
  fn list_max(arr: int[], len: int): int {
208
340
  let m: int = arr[0];
209
341
  let i: int = 1;
@@ -214,7 +346,12 @@ fn list_max(arr: int[], len: int): int {
214
346
  return m;
215
347
  }
216
348
 
217
- // list_contains(arr, len, val): 1 if val is in arr, 0 otherwise
349
+ /// Test whether a value exists in an array.
350
+ /// @since 1.0.0
351
+ /// @param arr Input array
352
+ /// @param len Number of elements
353
+ /// @param val Value to search for
354
+ /// @returns 1 if val is found, 0 otherwise
218
355
  fn list_contains(arr: int[], len: int, val: int): int {
219
356
  let i: int = 0;
220
357
  while (i < len) {
@@ -224,7 +361,12 @@ fn list_contains(arr: int[], len: int, val: int): int {
224
361
  return 0;
225
362
  }
226
363
 
227
- // list_index_of(arr, len, val): first index of val in arr, or -1 if not found
364
+ /// Find the first index of a value in an array.
365
+ /// @since 1.0.0
366
+ /// @param arr Input array
367
+ /// @param len Number of elements
368
+ /// @param val Value to search for
369
+ /// @returns First index of val, or -1 if not found
228
370
  fn list_index_of(arr: int[], len: int, val: int): int {
229
371
  let i: int = 0;
230
372
  while (i < len) {
@@ -234,8 +376,12 @@ fn list_index_of(arr: int[], len: int, val: int): int {
234
376
  return -1;
235
377
  }
236
378
 
237
- // list_shuffle(arr, len, seed): Fisher-Yates shuffle in-place using next_lcg RNG
238
- // For each i from len-1 down to 1: pick j in [0, i] using next_lcg, swap arr[i] and arr[j]
379
+ /// Fisher-Yates in-place shuffle using a linear congruential generator.
380
+ /// @since 1.0.0
381
+ /// @param arr Array to shuffle (modified in-place)
382
+ /// @param len Number of elements
383
+ /// @param seed Initial LCG seed (any integer)
384
+ /// @returns The shuffled array (same reference as arr)
239
385
  fn list_shuffle(arr: int[], len: int, seed: int): int[] {
240
386
  let i: int = len - 1;
241
387
  let s: int = seed;
@@ -252,7 +398,11 @@ fn list_shuffle(arr: int[], len: int, seed: int): int[] {
252
398
  return arr;
253
399
  }
254
400
 
255
- // list_dedup_count(arr, len): count of unique values (O(n²) fine for small arrays)
401
+ /// Count the number of unique values in an array (O(n²); suitable for small arrays).
402
+ /// @since 1.0.0
403
+ /// @param arr Input array
404
+ /// @param len Number of elements
405
+ /// @returns Count of distinct values in arr[0..len)
256
406
  fn list_dedup_count(arr: int[], len: int): int {
257
407
  let count: int = 0;
258
408
  let i: int = 0;
@@ -0,0 +1,112 @@
1
+ // map.mcrs — NBT compound-backed map helpers for RedScript datapacks.
2
+ //
3
+ // Maps are stored in `storage rs:maps` using a compound per map:
4
+ //
5
+ // rs:maps { Stats: { kills: 12, deaths: 3 } }
6
+ //
7
+ // `map_name` selects the top-level compound field. `key` selects the child
8
+ // field within that compound. Both values are interpolated directly into the
9
+ // NBT path, so callers should use path-safe identifiers (for example
10
+ // `Stats`, `kills`, `player_01`) rather than arbitrary user text.
11
+
12
+ module library;
13
+
14
+ fn __map_set_apply() {
15
+ raw("$execute store result storage rs:maps $(map_name).$(key) int 1 run data get storage rs:macro_args value");
16
+ }
17
+
18
+ fn __map_get_apply() {
19
+ raw("$execute store result score $ret __OBJ__ run data get storage rs:maps $(map_name).$(key)");
20
+ }
21
+
22
+ fn __map_has_apply() {
23
+ raw("$execute store success score $ret __OBJ__ if data storage rs:maps $(map_name).$(key)");
24
+ }
25
+
26
+ fn __map_delete_apply() {
27
+ raw("$data remove storage rs:maps $(map_name).$(key)");
28
+ }
29
+
30
+ fn __map_clear_apply() {
31
+ raw("$data remove storage rs:maps $(map_name)");
32
+ }
33
+
34
+ /// Stores an integer value in `storage rs:maps.{map_name}.{key}`.
35
+ ///
36
+ /// This creates the parent compound on demand if it does not already exist.
37
+ /// Both `map_name` and `key` are inserted directly into the NBT path, so they
38
+ /// must be valid path segments.
39
+ ///
40
+ /// @since 3.0.0
41
+ /// @param map_name Top-level map name under `storage rs:maps`
42
+ /// @param key Key name inside the selected map compound
43
+ /// @param value Integer value to write
44
+ /// @example
45
+ /// map_set("Stats", "kills", 7)
46
+ fn map_set(map_name: string, key: string, value: int) {
47
+ raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
48
+ raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
49
+ raw("execute store result storage rs:macro_args value int 1 run scoreboard players get $p0 __OBJ__");
50
+ raw("function __NS__:__map_set_apply with storage rs:macro_args");
51
+ }
52
+
53
+ /// Reads an integer value from `storage rs:maps.{map_name}.{key}`.
54
+ ///
55
+ /// If the path does not exist, this function returns `0`.
56
+ ///
57
+ /// @since 3.0.0
58
+ /// @param map_name Top-level map name under `storage rs:maps`
59
+ /// @param key Key name inside the selected map compound
60
+ /// @returns Stored integer value, or `0` if the key is missing
61
+ /// @example
62
+ /// let kills: int = map_get("Stats", "kills")
63
+ fn map_get(map_name: string, key: string): int {
64
+ raw("scoreboard players set $ret __OBJ__ 0");
65
+ raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
66
+ raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
67
+ raw("function __NS__:__map_get_apply with storage rs:macro_args");
68
+ raw("return 1");
69
+ return 0;
70
+ }
71
+
72
+ /// Checks whether `storage rs:maps.{map_name}.{key}` exists.
73
+ ///
74
+ /// @since 3.0.0
75
+ /// @param map_name Top-level map name under `storage rs:maps`
76
+ /// @param key Key name inside the selected map compound
77
+ /// @returns `1` if the key exists, otherwise `0`
78
+ /// @example
79
+ /// if (map_has("Stats", "kills") == 1) { }
80
+ fn map_has(map_name: string, key: string): int {
81
+ raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
82
+ raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
83
+ raw("function __NS__:__map_has_apply with storage rs:macro_args");
84
+ raw("return 1");
85
+ return 0;
86
+ }
87
+
88
+ /// Removes a key from the selected map compound.
89
+ ///
90
+ /// Removing a missing key is a no-op in Minecraft.
91
+ ///
92
+ /// @since 3.0.0
93
+ /// @param map_name Top-level map name under `storage rs:maps`
94
+ /// @param key Key name inside the selected map compound
95
+ /// @example
96
+ /// map_delete("Stats", "kills")
97
+ fn map_delete(map_name: string, key: string) {
98
+ raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
99
+ raw("data modify storage rs:macro_args key set from storage rs:strings __sp1");
100
+ raw("function __NS__:__map_delete_apply with storage rs:macro_args");
101
+ }
102
+
103
+ /// Removes the entire map compound from `storage rs:maps`.
104
+ ///
105
+ /// @since 3.0.0
106
+ /// @param map_name Top-level map name under `storage rs:maps`
107
+ /// @example
108
+ /// map_clear("Stats")
109
+ fn map_clear(map_name: string) {
110
+ raw("data modify storage rs:macro_args map_name set from storage rs:strings __sp0");
111
+ raw("function __NS__:__map_clear_apply with storage rs:macro_args");
112
+ }
@@ -17,6 +17,13 @@ module library;
17
17
 
18
18
  // ─── Phase 1: Basic integer helpers ──────────────────────────────────────────
19
19
 
20
+ /// Return the absolute value of x.
21
+ /// @since 1.0.0
22
+ /// @param x The input value (any numeric type T)
23
+ /// @returns x if x >= 0, else -x
24
+ /// @example
25
+ /// let a = abs(-5) // result: 5
26
+ /// let b = abs(3) // result: 3
20
27
  fn abs<T>(x: T) -> T {
21
28
  if (x < 0) {
22
29
  return 0 - x;
@@ -24,6 +31,12 @@ fn abs<T>(x: T) -> T {
24
31
  return x;
25
32
  }
26
33
 
34
+ /// Return the sign of x: 1, 0, or -1.
35
+ /// @since 1.0.0
36
+ /// @param x Input integer
37
+ /// @returns 1 if x > 0, -1 if x < 0, 0 if x == 0
38
+ /// @example
39
+ /// let s = sign(-42) // result: -1
27
40
  fn sign(x: int) -> int {
28
41
  if (x > 0) {
29
42
  return 1;
@@ -34,6 +47,13 @@ fn sign(x: int) -> int {
34
47
  return 0;
35
48
  }
36
49
 
50
+ /// Return the smaller of two values.
51
+ /// @since 1.0.0
52
+ /// @param a First value
53
+ /// @param b Second value
54
+ /// @returns a if a < b, else b
55
+ /// @example
56
+ /// let m = min(3, 7) // result: 3
37
57
  fn min<T>(a: T, b: T) -> T {
38
58
  if (a < b) {
39
59
  return a;
@@ -41,6 +61,13 @@ fn min<T>(a: T, b: T) -> T {
41
61
  return b;
42
62
  }
43
63
 
64
+ /// Return the larger of two values.
65
+ /// @since 1.0.0
66
+ /// @param a First value
67
+ /// @param b Second value
68
+ /// @returns a if a > b, else b
69
+ /// @example
70
+ /// let m = max(3, 7) // result: 7
44
71
  fn max<T>(a: T, b: T) -> T {
45
72
  if (a > b) {
46
73
  return a;
@@ -48,6 +75,15 @@ fn max<T>(a: T, b: T) -> T {
48
75
  return b;
49
76
  }
50
77
 
78
+ /// Clamp x to the range [lo, hi].
79
+ /// @since 1.0.0
80
+ /// @param x Input value
81
+ /// @param lo Lower bound (inclusive)
82
+ /// @param hi Upper bound (inclusive)
83
+ /// @returns lo if x < lo; hi if x > hi; otherwise x
84
+ /// @example
85
+ /// let c = clamp(150, 0, 100) // result: 100
86
+ /// let d = clamp(50, 0, 100) // result: 50
51
87
  fn clamp<T>(x: T, lo: T, hi: T) -> T {
52
88
  if (x < lo) {
53
89
  return lo;
@@ -58,9 +94,15 @@ fn clamp<T>(x: T, lo: T, hi: T) -> T {
58
94
  return x;
59
95
  }
60
96
 
61
- // Linear interpolation (fixed-point t, t in [0, 1000])
62
- // lerp(0, 1000, 500) == 500
63
- // lerp(100, 200, 750) == 175
97
+ /// Linear interpolation between a and b using fixed-point t in [0, 1000].
98
+ /// @since 1.0.0
99
+ /// @param a Start value
100
+ /// @param b End value
101
+ /// @param t Interpolation factor ×1000 (0 = a, 1000 = b)
102
+ /// @returns a + (b - a) * t / 1000
103
+ /// @example
104
+ /// let v = lerp(0, 1000, 500) // result: 500
105
+ /// let w = lerp(100, 200, 750) // result: 175
64
106
  fn lerp(a: int, b: int, t: int) -> int {
65
107
  return a + (b - a) * t / 1000;
66
108
  }
@@ -100,9 +142,13 @@ fn isqrt(n: int) -> int {
100
142
  return x;
101
143
  }
102
144
 
103
- // Fixed-point sqrt (scale = 1000)
104
- // sqrt_fixed(2000) ≈ 1414 (√2 × 1000)
105
- // sqrt_fixed(1000) == 1000 (√1 × 1000)
145
+ /// Fixed-point square root (scale = 1000).
146
+ /// @since 1.0.0
147
+ /// @param x Input value ×1000 (i.e. 2.0 → 2000)
148
+ /// @returns sqrt(x/1000) × 1000
149
+ /// @example
150
+ /// let s = sqrt_fixed(2000) // result: ~1414 (√2 × 1000)
151
+ /// let t = sqrt_fixed(1000) // result: 1000 (√1 × 1000)
106
152
  fn sqrt_fixed(x: int) -> int {
107
153
  return isqrt(x * 1000);
108
154
  }
@@ -162,14 +208,14 @@ fn _math_init() {
162
208
  );
163
209
  }
164
210
 
165
- // sin_fixed(deg) sin(deg°) × 1000 (integer degrees, any value)
166
- // sin_fixed(30) == 500
167
- // sin_fixed(90) == 1000
168
- // sin_fixed(180) == 0
169
- // sin_fixed(270) == -1000
170
- //
171
- // @require_on_load(_math_init): the sin lookup table is written to NBT storage at
172
- // world load automatically when this function is included in a project.
211
+ /// Sine of an angle in integer degrees, returned as ×1000 fixed-point.
212
+ /// Uses a 91-entry lookup table stored in NBT (math:tables.sin).
213
+ /// @since 2.0.0
214
+ /// @param deg Angle in degrees (any integer; normalised mod 360)
215
+ /// @returns sin(deg°) × 1000 (range: -1000 to 1000)
216
+ /// @example
217
+ /// let s = sin_fixed(30) // result: 500
218
+ /// let t = sin_fixed(270) // result: -1000
173
219
  @require_on_load(_math_init)
174
220
  fn sin_fixed(deg: int) -> int {
175
221
  // Normalise to [0, 359]
@@ -192,10 +238,14 @@ fn sin_fixed(deg: int) -> int {
192
238
  return 0 - storage_get_int("math:tables", "sin", idx);
193
239
  }
194
240
 
195
- // cos_fixed(deg) cos(deg°) × 1000 (integer degrees, any value)
196
- // cos_fixed(0) == 1000
197
- // cos_fixed(90) == 0
198
- // cos_fixed(180) == -1000
241
+ /// Cosine of an angle in integer degrees, returned as ×1000 fixed-point.
242
+ /// Implemented as sin_fixed(deg + 90).
243
+ /// @since 2.0.0
244
+ /// @param deg Angle in degrees (any integer; normalised mod 360)
245
+ /// @returns cos(deg°) × 1000 (range: -1000 to 1000)
246
+ /// @example
247
+ /// let c = cos_fixed(0) // result: 1000
248
+ /// let d = cos_fixed(180) // result: -1000
199
249
  @require_on_load(_math_init)
200
250
  fn cos_fixed(deg: int) -> int {
201
251
  return sin_fixed(deg + 90);