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.
- package/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- package/src/typechecker/index.ts +273 -9
package/src/stdlib/bigint.mcrs
CHANGED
|
@@ -19,6 +19,9 @@ module library;
|
|
|
19
19
|
|
|
20
20
|
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
21
21
|
|
|
22
|
+
/// Return the bigint base (10000 = base-10000, each chunk holds 4 decimal digits).
|
|
23
|
+
/// @since 1.0.0
|
|
24
|
+
/// @returns 10000
|
|
22
25
|
fn bigint_base(): int { return 10000; }
|
|
23
26
|
|
|
24
27
|
// ─── Single-chunk helpers ────────────────────────────────────────────────────
|
|
@@ -96,20 +99,37 @@ fn bigint3_rem_chunk(chunk: int, rem: int, divisor: int): int {
|
|
|
96
99
|
|
|
97
100
|
// ─── Arbitrary-length operations (array by-ref, RedScript ≥ 2.4.0) ──────────
|
|
98
101
|
|
|
99
|
-
|
|
102
|
+
/// Set all chunks of a bigint array to zero.
|
|
103
|
+
/// @since 1.0.0
|
|
104
|
+
/// @param arr BigInt array (most-significant chunk at index 0)
|
|
105
|
+
/// @param len Number of chunks
|
|
106
|
+
/// @returns void — arr[0..len-1] set to 0
|
|
107
|
+
/// @example
|
|
108
|
+
/// bigint_zero(result, 4) // zero out a 4-chunk bigint
|
|
100
109
|
fn bigint_zero(arr: int[], len: int) {
|
|
101
110
|
let i: int = 0;
|
|
102
111
|
while (i < len) { arr[i] = 0; i = i + 1; }
|
|
103
112
|
}
|
|
104
113
|
|
|
105
|
-
|
|
114
|
+
/// Copy a bigint from src into dst.
|
|
115
|
+
/// @since 1.0.0
|
|
116
|
+
/// @param src Source bigint array
|
|
117
|
+
/// @param dst Destination bigint array (must have length >= len)
|
|
118
|
+
/// @param len Number of chunks to copy
|
|
119
|
+
/// @returns void — dst[0..len-1] = src[0..len-1]
|
|
106
120
|
fn bigint_copy(src: int[], dst: int[], len: int) {
|
|
107
121
|
let i: int = 0;
|
|
108
122
|
while (i < len) { dst[i] = src[i]; i = i + 1; }
|
|
109
123
|
}
|
|
110
124
|
|
|
111
|
-
|
|
112
|
-
|
|
125
|
+
/// Compare two bigints of equal length.
|
|
126
|
+
/// @since 1.0.0
|
|
127
|
+
/// @param a First bigint (most-significant chunk at index 0)
|
|
128
|
+
/// @param b Second bigint
|
|
129
|
+
/// @param len Number of chunks (must be equal for both)
|
|
130
|
+
/// @returns 1 if a > b, -1 if a < b, 0 if equal
|
|
131
|
+
/// @example
|
|
132
|
+
/// let cmp: int = bigint_cmp(a, b, 4)
|
|
113
133
|
fn bigint_cmp(a: int[], b: int[], len: int): int {
|
|
114
134
|
let i: int = 0;
|
|
115
135
|
while (i < len) {
|
|
@@ -120,8 +140,15 @@ fn bigint_cmp(a: int[], b: int[], len: int): int {
|
|
|
120
140
|
return 0;
|
|
121
141
|
}
|
|
122
142
|
|
|
123
|
-
|
|
124
|
-
|
|
143
|
+
/// Add two bigints of equal length, writing result into a pre-allocated array.
|
|
144
|
+
/// @since 1.0.0
|
|
145
|
+
/// @param a First bigint addend
|
|
146
|
+
/// @param b Second bigint addend
|
|
147
|
+
/// @param result Output bigint array (must have length >= len, may alias a or b)
|
|
148
|
+
/// @param len Number of chunks
|
|
149
|
+
/// @returns Carry out: 0 or 1 (overflow if non-zero)
|
|
150
|
+
/// @example
|
|
151
|
+
/// let carry: int = bigint_add(a, b, result, 4)
|
|
125
152
|
fn bigint_add(a: int[], b: int[], result: int[], len: int): int {
|
|
126
153
|
let carry: int = 0;
|
|
127
154
|
let i: int = len - 1; // start from least significant (rightmost)
|
|
@@ -134,7 +161,13 @@ fn bigint_add(a: int[], b: int[], result: int[], len: int): int {
|
|
|
134
161
|
return carry;
|
|
135
162
|
}
|
|
136
163
|
|
|
137
|
-
|
|
164
|
+
/// Subtract bigint b from a, writing result (assumes a >= b, no underflow check).
|
|
165
|
+
/// @since 1.0.0
|
|
166
|
+
/// @param a Minuend bigint
|
|
167
|
+
/// @param b Subtrahend bigint (must be <= a)
|
|
168
|
+
/// @param result Output bigint array
|
|
169
|
+
/// @param len Number of chunks
|
|
170
|
+
/// @returns void — result = a - b
|
|
138
171
|
fn bigint_sub(a: int[], b: int[], result: int[], len: int) {
|
|
139
172
|
let borrow: int = 0;
|
|
140
173
|
let i: int = len - 1;
|
|
@@ -150,7 +183,15 @@ fn bigint_sub(a: int[], b: int[], result: int[], len: int) {
|
|
|
150
183
|
}
|
|
151
184
|
}
|
|
152
185
|
|
|
153
|
-
|
|
186
|
+
/// Multiply a bigint by a small integer (1 ≤ n ≤ 9999).
|
|
187
|
+
/// @since 1.0.0
|
|
188
|
+
/// @param a Bigint multiplicand
|
|
189
|
+
/// @param n Small integer multiplier (must be in [1, 9999] to avoid overflow)
|
|
190
|
+
/// @param result Output bigint array (must have length >= len)
|
|
191
|
+
/// @param len Number of chunks
|
|
192
|
+
/// @returns void — result = a * n; high overflow is silently lost
|
|
193
|
+
/// @example
|
|
194
|
+
/// bigint_mul_small(a, 1000, result, 4) // result = a × 1000
|
|
154
195
|
fn bigint_mul_small(a: int[], n: int, result: int[], len: int) {
|
|
155
196
|
let carry: int = 0;
|
|
156
197
|
let i: int = len - 1;
|
|
@@ -201,8 +242,15 @@ fn bigint_leading_zeros(arr: int[], len: int): int {
|
|
|
201
242
|
// result[i] = (rem*10000 + a[i]) / divisor
|
|
202
243
|
// rem = (rem*10000 + a[i]) % divisor
|
|
203
244
|
|
|
204
|
-
|
|
205
|
-
|
|
245
|
+
/// Divide a bigint by a small integer (1 ≤ divisor ≤ 9999), returning quotient and remainder.
|
|
246
|
+
/// @since 1.0.0
|
|
247
|
+
/// @param a Dividend bigint
|
|
248
|
+
/// @param divisor Small integer divisor (range [1, 9999])
|
|
249
|
+
/// @param result Output quotient bigint array
|
|
250
|
+
/// @param len Number of chunks
|
|
251
|
+
/// @returns Remainder (0..divisor-1)
|
|
252
|
+
/// @example
|
|
253
|
+
/// let rem: int = bigint_div_small(a, 7, result, 4)
|
|
206
254
|
fn bigint_div_small(a: int[], divisor: int, result: int[], len: int): int {
|
|
207
255
|
let rem: int = 0;
|
|
208
256
|
let i: int = 0;
|
|
@@ -215,7 +263,14 @@ fn bigint_div_small(a: int[], divisor: int, result: int[], len: int): int {
|
|
|
215
263
|
return rem;
|
|
216
264
|
}
|
|
217
265
|
|
|
218
|
-
|
|
266
|
+
/// Compute a bigint modulo a small integer without allocating a quotient array.
|
|
267
|
+
/// @since 1.0.0
|
|
268
|
+
/// @param a Dividend bigint
|
|
269
|
+
/// @param divisor Small integer divisor (range [1, 9999])
|
|
270
|
+
/// @param len Number of chunks
|
|
271
|
+
/// @returns a % divisor, in [0, divisor-1]
|
|
272
|
+
/// @example
|
|
273
|
+
/// let mod: int = bigint_mod_small(a, 10, 4) // last decimal digit of a
|
|
219
274
|
fn bigint_mod_small(a: int[], divisor: int, len: int): int {
|
|
220
275
|
let rem: int = 0;
|
|
221
276
|
let i: int = 0;
|
|
@@ -248,6 +303,17 @@ fn bigint_chunk(a: int[], i: int): int {
|
|
|
248
303
|
// let result: int[] = [0, 0, 0, 0, 0, 0, 0]; // la+lb = 7 chunks, pre-zeroed
|
|
249
304
|
// bigint_mul(a, b, result, 4, 3);
|
|
250
305
|
//
|
|
306
|
+
/// Multiply two bigints using schoolbook O(n²) algorithm.
|
|
307
|
+
/// @since 1.0.0
|
|
308
|
+
/// @param a First bigint (la chunks)
|
|
309
|
+
/// @param b Second bigint (lb chunks)
|
|
310
|
+
/// @param result Output bigint array (must have la+lb chunks, pre-zeroed)
|
|
311
|
+
/// @param la Number of chunks in a
|
|
312
|
+
/// @param lb Number of chunks in b
|
|
313
|
+
/// @returns void — result = a * b; result must not alias a or b
|
|
314
|
+
/// @example
|
|
315
|
+
/// let result: int[] = [0, 0, 0, 0, 0, 0, 0]
|
|
316
|
+
/// bigint_mul(a, b, result, 4, 3)
|
|
251
317
|
fn bigint_mul(a: int[], b: int[], result: int[], la: int, lb: int) {
|
|
252
318
|
// Phase 1: accumulate partial products (big-endian, MSB at index 0)
|
|
253
319
|
// a[i] is the (la-1-i)-th digit from LSB, similarly for b[j]
|
|
@@ -286,6 +352,15 @@ fn bigint_mul_result_len(la: int, lb: int): int {
|
|
|
286
352
|
// result must have len*2 chunks (pre-zeroed).
|
|
287
353
|
// Optimized: only compute upper triangle and double (avoids redundant multiplications).
|
|
288
354
|
//
|
|
355
|
+
/// Square a bigint (optimized: computes upper triangle only).
|
|
356
|
+
/// @since 1.0.0
|
|
357
|
+
/// @param a Bigint to square (len chunks)
|
|
358
|
+
/// @param result Output bigint array (must have len*2 chunks, pre-zeroed)
|
|
359
|
+
/// @param len Number of chunks in a
|
|
360
|
+
/// @returns void — result = a * a
|
|
361
|
+
/// @example
|
|
362
|
+
/// let sq: int[] = [0, 0, 0, 0, 0, 0, 0, 0]
|
|
363
|
+
/// bigint_sq(a, sq, 4) // sq = a²
|
|
289
364
|
fn bigint_sq(a: int[], result: int[], len: int) {
|
|
290
365
|
// Diagonal terms (i == j)
|
|
291
366
|
let i: int = 0;
|
|
@@ -392,6 +467,17 @@ fn bigint_mul_small_into(b: int[], factor: int, out: int[], len: int): void {
|
|
|
392
467
|
// quotient[0..la-1] is written, remainder[0..lb-1] is written.
|
|
393
468
|
// a and b must not alias quotient or remainder.
|
|
394
469
|
// NOTE: la >= lb required; both arrays most-significant first, base 10000.
|
|
470
|
+
/// Full arbitrary-precision integer division: a / b → quotient and remainder.
|
|
471
|
+
/// @since 1.0.0
|
|
472
|
+
/// @param a Dividend bigint (la chunks)
|
|
473
|
+
/// @param b Divisor bigint (lb chunks)
|
|
474
|
+
/// @param quotient Output quotient array (la chunks, pre-zeroed)
|
|
475
|
+
/// @param remainder Output remainder array (lb chunks, pre-zeroed)
|
|
476
|
+
/// @param la Number of chunks in a (must be >= lb)
|
|
477
|
+
/// @param lb Number of chunks in b
|
|
478
|
+
/// @returns void — quotient = a/b, remainder = a%b; a and b must not alias outputs
|
|
479
|
+
/// @example
|
|
480
|
+
/// bigint_div(a, b, quotient, remainder, 4, 2)
|
|
395
481
|
fn bigint_div(a: int[], b: int[], quotient: int[], remainder: int[], la: int, lb: int): void {
|
|
396
482
|
// Work on a copy of a (dividend) to allow in-place subtraction
|
|
397
483
|
let work: int[] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
package/src/stdlib/bits.mcrs
CHANGED
|
@@ -16,7 +16,13 @@ module library;
|
|
|
16
16
|
|
|
17
17
|
// ─── Core: single-bit operations ─────────────────────────────────────────────
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
/// Test whether bit n of x is set.
|
|
20
|
+
/// @since 1.0.0
|
|
21
|
+
/// @param x Integer value to test
|
|
22
|
+
/// @param n Bit index (0 = least significant), range [0, 30]
|
|
23
|
+
/// @returns 1 if bit n is set, 0 otherwise
|
|
24
|
+
/// @example
|
|
25
|
+
/// let b: int = bit_get(0b1010, 1) // result: 1 (bit 1 of 10 is set)
|
|
20
26
|
fn bit_get(x: int, n: int): int {
|
|
21
27
|
let mask: int = 1;
|
|
22
28
|
let i: int = 0;
|
|
@@ -24,7 +30,13 @@ fn bit_get(x: int, n: int): int {
|
|
|
24
30
|
return (x / mask) % 2;
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
|
|
33
|
+
/// Set bit n of x to 1 (idempotent if already set).
|
|
34
|
+
/// @since 1.0.0
|
|
35
|
+
/// @param x Integer value to modify
|
|
36
|
+
/// @param n Bit index to set, range [0, 30]
|
|
37
|
+
/// @returns x with bit n set to 1
|
|
38
|
+
/// @example
|
|
39
|
+
/// let v: int = bit_set(0b0100, 0) // result: 0b0101 = 5
|
|
28
40
|
fn bit_set(x: int, n: int): int {
|
|
29
41
|
let mask: int = 1;
|
|
30
42
|
let i: int = 0;
|
|
@@ -33,7 +45,13 @@ fn bit_set(x: int, n: int): int {
|
|
|
33
45
|
return x;
|
|
34
46
|
}
|
|
35
47
|
|
|
36
|
-
|
|
48
|
+
/// Clear bit n of x to 0 (idempotent if already clear).
|
|
49
|
+
/// @since 1.0.0
|
|
50
|
+
/// @param x Integer value to modify
|
|
51
|
+
/// @param n Bit index to clear, range [0, 30]
|
|
52
|
+
/// @returns x with bit n set to 0
|
|
53
|
+
/// @example
|
|
54
|
+
/// let v: int = bit_clear(0b0111, 1) // result: 0b0101 = 5
|
|
37
55
|
fn bit_clear(x: int, n: int): int {
|
|
38
56
|
let mask: int = 1;
|
|
39
57
|
let i: int = 0;
|
|
@@ -42,7 +60,13 @@ fn bit_clear(x: int, n: int): int {
|
|
|
42
60
|
return x;
|
|
43
61
|
}
|
|
44
62
|
|
|
45
|
-
|
|
63
|
+
/// Toggle bit n of x (flip 0→1 or 1→0).
|
|
64
|
+
/// @since 1.0.0
|
|
65
|
+
/// @param x Integer value to modify
|
|
66
|
+
/// @param n Bit index to toggle, range [0, 30]
|
|
67
|
+
/// @returns x with bit n flipped
|
|
68
|
+
/// @example
|
|
69
|
+
/// let v: int = bit_toggle(0b0101, 1) // result: 0b0111 = 7
|
|
46
70
|
fn bit_toggle(x: int, n: int): int {
|
|
47
71
|
let mask: int = 1;
|
|
48
72
|
let i: int = 0;
|
|
@@ -53,7 +77,13 @@ fn bit_toggle(x: int, n: int): int {
|
|
|
53
77
|
|
|
54
78
|
// ─── Shift operations ────────────────────────────────────────────────────────
|
|
55
79
|
|
|
56
|
-
|
|
80
|
+
/// Left-shift x by n bits (equivalent to x * 2^n).
|
|
81
|
+
/// @since 1.0.0
|
|
82
|
+
/// @param x Integer to shift
|
|
83
|
+
/// @param n Number of bit positions to shift left, range [0, 30]
|
|
84
|
+
/// @returns x << n
|
|
85
|
+
/// @example
|
|
86
|
+
/// let v: int = bit_shl(1, 4) // result: 16 (1 << 4)
|
|
57
87
|
fn bit_shl(x: int, n: int): int {
|
|
58
88
|
let result: int = x;
|
|
59
89
|
let i: int = 0;
|
|
@@ -61,8 +91,13 @@ fn bit_shl(x: int, n: int): int {
|
|
|
61
91
|
return result;
|
|
62
92
|
}
|
|
63
93
|
|
|
64
|
-
|
|
65
|
-
|
|
94
|
+
/// Logical right-shift x by n bits (equivalent to x / 2^n, truncating toward zero).
|
|
95
|
+
/// @since 1.0.0
|
|
96
|
+
/// @param x Integer to shift
|
|
97
|
+
/// @param n Number of bit positions to shift right, range [0, 30]
|
|
98
|
+
/// @returns x >> n (logical, not arithmetic for positive values)
|
|
99
|
+
/// @example
|
|
100
|
+
/// let v: int = bit_shr(256, 3) // result: 32 (256 >> 3)
|
|
66
101
|
fn bit_shr(x: int, n: int): int {
|
|
67
102
|
let result: int = x;
|
|
68
103
|
let i: int = 0;
|
|
@@ -73,7 +108,13 @@ fn bit_shr(x: int, n: int): int {
|
|
|
73
108
|
// ─── Bitwise AND / OR / XOR ──────────────────────────────────────────────────
|
|
74
109
|
// These iterate over 31 bits (signed int32, bit 31 is sign).
|
|
75
110
|
|
|
76
|
-
|
|
111
|
+
/// Bitwise AND of two integers (all 31 non-sign bits).
|
|
112
|
+
/// @since 1.0.0
|
|
113
|
+
/// @param a First operand
|
|
114
|
+
/// @param b Second operand
|
|
115
|
+
/// @returns a & b (bits set in both a and b)
|
|
116
|
+
/// @example
|
|
117
|
+
/// let v: int = bit_and(0b1100, 0b1010) // result: 0b1000 = 8
|
|
77
118
|
fn bit_and(a: int, b: int): int {
|
|
78
119
|
let result: int = 0;
|
|
79
120
|
let mask: int = 1;
|
|
@@ -90,7 +131,13 @@ fn bit_and(a: int, b: int): int {
|
|
|
90
131
|
return result;
|
|
91
132
|
}
|
|
92
133
|
|
|
93
|
-
|
|
134
|
+
/// Bitwise OR of two integers (all 31 non-sign bits).
|
|
135
|
+
/// @since 1.0.0
|
|
136
|
+
/// @param a First operand
|
|
137
|
+
/// @param b Second operand
|
|
138
|
+
/// @returns a | b (bits set in either a or b)
|
|
139
|
+
/// @example
|
|
140
|
+
/// let v: int = bit_or(0b1100, 0b1010) // result: 0b1110 = 14
|
|
94
141
|
fn bit_or(a: int, b: int): int {
|
|
95
142
|
let result: int = 0;
|
|
96
143
|
let mask: int = 1;
|
|
@@ -110,7 +157,13 @@ fn bit_or(a: int, b: int): int {
|
|
|
110
157
|
return result;
|
|
111
158
|
}
|
|
112
159
|
|
|
113
|
-
|
|
160
|
+
/// Bitwise XOR of two integers (all 31 non-sign bits).
|
|
161
|
+
/// @since 1.0.0
|
|
162
|
+
/// @param a First operand
|
|
163
|
+
/// @param b Second operand
|
|
164
|
+
/// @returns a ^ b (bits set in exactly one of a or b)
|
|
165
|
+
/// @example
|
|
166
|
+
/// let v: int = bit_xor(0b1100, 0b1010) // result: 0b0110 = 6
|
|
114
167
|
fn bit_xor(a: int, b: int): int {
|
|
115
168
|
let result: int = 0;
|
|
116
169
|
let mask: int = 1;
|
|
@@ -127,7 +180,12 @@ fn bit_xor(a: int, b: int): int {
|
|
|
127
180
|
return result;
|
|
128
181
|
}
|
|
129
182
|
|
|
130
|
-
|
|
183
|
+
/// Bitwise NOT — inverts all 31 non-sign bits of x.
|
|
184
|
+
/// @since 1.0.0
|
|
185
|
+
/// @param x Integer to invert
|
|
186
|
+
/// @returns ~x (all 31 lower bits flipped; sign bit excluded)
|
|
187
|
+
/// @example
|
|
188
|
+
/// let v: int = bit_not(0) // result: 2147483647 (all 31 bits set)
|
|
131
189
|
fn bit_not(x: int): int {
|
|
132
190
|
let result: int = 0;
|
|
133
191
|
let mask: int = 1;
|
|
@@ -144,7 +202,12 @@ fn bit_not(x: int): int {
|
|
|
144
202
|
|
|
145
203
|
// ─── Popcount ────────────────────────────────────────────────────────────────
|
|
146
204
|
|
|
147
|
-
|
|
205
|
+
/// Count the number of set bits in x (population count / Hamming weight).
|
|
206
|
+
/// @since 1.0.0
|
|
207
|
+
/// @param x Integer value (uses 31 lower bits; sign bit excluded)
|
|
208
|
+
/// @returns Number of bits set to 1, in [0, 31]
|
|
209
|
+
/// @example
|
|
210
|
+
/// let n: int = popcount(255) // result: 8 (0xFF has 8 bits set)
|
|
148
211
|
fn popcount(x: int): int {
|
|
149
212
|
let count: int = 0;
|
|
150
213
|
let v: int = x;
|
package/src/stdlib/bossbar.mcrs
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
// Bossbar helpers for progress bars and timers
|
|
2
2
|
// Usage: import "stdlib/bossbar.mcrs"
|
|
3
3
|
|
|
4
|
-
///
|
|
4
|
+
/// Creates a visible timer bossbar for all players.
|
|
5
|
+
/// The bossbar max and current value are initialized to `max_seconds * 20`
|
|
6
|
+
/// so callers can update it directly in game ticks.
|
|
7
|
+
/// @param id Bossbar identifier, usually `<namespace>:<name>`
|
|
8
|
+
/// @param name Display name shown on the bossbar
|
|
9
|
+
/// @param max_seconds Duration in seconds; converted to ticks internally
|
|
10
|
+
/// @example
|
|
11
|
+
/// create_timer_bar("game:round", "Round Timer", 90)
|
|
5
12
|
fn create_timer_bar(id: string, name: string, max_seconds: int) {
|
|
6
13
|
bossbar_add(id, name);
|
|
7
14
|
bossbar_set_max(id, max_seconds * 20);
|
|
@@ -12,7 +19,13 @@ fn create_timer_bar(id: string, name: string, max_seconds: int) {
|
|
|
12
19
|
bossbar_set_visible(id, 1);
|
|
13
20
|
}
|
|
14
21
|
|
|
15
|
-
///
|
|
22
|
+
/// Creates a visible red bossbar initialized at full value.
|
|
23
|
+
/// Useful for boss HP or shared health objectives.
|
|
24
|
+
/// @param id Bossbar identifier, usually `<namespace>:<name>`
|
|
25
|
+
/// @param name Display name shown on the bossbar
|
|
26
|
+
/// @param max_val Maximum value and initial value of the bar
|
|
27
|
+
/// @example
|
|
28
|
+
/// create_health_bar("raid:boss_hp", "Warden", 500)
|
|
16
29
|
fn create_health_bar(id: string, name: string, max_val: int) {
|
|
17
30
|
bossbar_add(id, name);
|
|
18
31
|
bossbar_set_max(id, max_val);
|
|
@@ -23,7 +36,13 @@ fn create_health_bar(id: string, name: string, max_val: int) {
|
|
|
23
36
|
bossbar_set_visible(id, 1);
|
|
24
37
|
}
|
|
25
38
|
|
|
26
|
-
///
|
|
39
|
+
/// Creates a visible blue progress bossbar starting at zero.
|
|
40
|
+
/// Useful for charge bars, capture progress, or phase tracking.
|
|
41
|
+
/// @param id Bossbar identifier, usually `<namespace>:<name>`
|
|
42
|
+
/// @param name Display name shown on the bossbar
|
|
43
|
+
/// @param max_val Maximum progress value
|
|
44
|
+
/// @example
|
|
45
|
+
/// create_progress_bar("game:capture", "Capture", 100)
|
|
27
46
|
fn create_progress_bar(id: string, name: string, max_val: int) {
|
|
28
47
|
bossbar_add(id, name);
|
|
29
48
|
bossbar_set_max(id, max_val);
|
|
@@ -34,27 +53,37 @@ fn create_progress_bar(id: string, name: string, max_val: int) {
|
|
|
34
53
|
bossbar_set_visible(id, 1);
|
|
35
54
|
}
|
|
36
55
|
|
|
37
|
-
///
|
|
56
|
+
/// Sets the current value of an existing bossbar.
|
|
57
|
+
/// RedScript does not clamp the value; Minecraft handles display behavior.
|
|
58
|
+
/// @param id Bossbar identifier
|
|
59
|
+
/// @param value New current value
|
|
38
60
|
fn update_bar(id: string, value: int) {
|
|
39
61
|
bossbar_set_value(id, value);
|
|
40
62
|
}
|
|
41
63
|
|
|
42
|
-
///
|
|
64
|
+
/// Hides an existing bossbar from all assigned players.
|
|
65
|
+
/// @param id Bossbar identifier
|
|
43
66
|
fn hide_bar(id: string) {
|
|
44
67
|
bossbar_set_visible(id, 0);
|
|
45
68
|
}
|
|
46
69
|
|
|
47
|
-
///
|
|
70
|
+
/// Shows an existing bossbar to all assigned players.
|
|
71
|
+
/// @param id Bossbar identifier
|
|
48
72
|
fn show_bar(id: string) {
|
|
49
73
|
bossbar_set_visible(id, 1);
|
|
50
74
|
}
|
|
51
75
|
|
|
52
|
-
///
|
|
76
|
+
/// Removes an existing bossbar entirely.
|
|
77
|
+
/// After removal, the same `id` must be recreated before reuse.
|
|
78
|
+
/// @param id Bossbar identifier
|
|
53
79
|
fn remove_bar(id: string) {
|
|
54
80
|
bossbar_remove(id);
|
|
55
81
|
}
|
|
56
82
|
|
|
57
|
-
///
|
|
83
|
+
/// Updates the bossbar color from a percentage threshold.
|
|
84
|
+
/// Values above 66 use green, above 33 use yellow, otherwise red.
|
|
85
|
+
/// @param id Bossbar identifier
|
|
86
|
+
/// @param percent Percentage in the expected 0-100 range
|
|
58
87
|
fn update_bar_color(id: string, percent: int) {
|
|
59
88
|
if (percent > 66) {
|
|
60
89
|
bossbar_set_color(id, "green");
|
package/src/stdlib/calculus.mcrs
CHANGED
|
@@ -12,24 +12,35 @@ module library;
|
|
|
12
12
|
|
|
13
13
|
// ─── Differentiation ─────────────────────────────────────────────────────────
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
/// Forward-difference derivative: (f(x+h) − f(x)) / h.
|
|
16
|
+
/// @since 1.3.0
|
|
17
|
+
/// @param f1 f(x + h) × 10000
|
|
18
|
+
/// @param f0 f(x) × 10000
|
|
19
|
+
/// @param h_fx Step size × 10000 (must not be zero)
|
|
20
|
+
/// @returns df/dx × 10000; returns 0 if h_fx == 0
|
|
18
21
|
fn deriv_forward(f1: int, f0: int, h_fx: int): int {
|
|
19
22
|
if (h_fx == 0) { return 0; }
|
|
20
23
|
return (f1 - f0) * 10000 / h_fx;
|
|
21
24
|
}
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
/// Central-difference derivative: (f(x+h) − f(x−h)) / (2h). More accurate than forward difference.
|
|
27
|
+
/// @since 1.3.0
|
|
28
|
+
/// @param f_plus f(x + h) × 10000
|
|
29
|
+
/// @param f_minus f(x − h) × 10000
|
|
30
|
+
/// @param h_fx Step size × 10000 (must not be zero)
|
|
31
|
+
/// @returns df/dx × 10000; returns 0 if h_fx == 0
|
|
26
32
|
fn deriv_central(f_plus: int, f_minus: int, h_fx: int): int {
|
|
27
33
|
if (h_fx == 0) { return 0; }
|
|
28
34
|
return (f_plus - f_minus) * 10000 / (2 * h_fx);
|
|
29
35
|
}
|
|
30
36
|
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
/// Second derivative via the central finite-difference formula: (f(x+h) − 2f(x) + f(x−h)) / h².
|
|
38
|
+
/// @since 1.3.0
|
|
39
|
+
/// @param f_plus f(x + h) × 10000
|
|
40
|
+
/// @param f0 f(x) × 10000
|
|
41
|
+
/// @param f_minus f(x − h) × 10000
|
|
42
|
+
/// @param h_fx Step size × 10000 (must not be zero)
|
|
43
|
+
/// @returns d²f/dx² × 10000; returns 0 if h_fx == 0
|
|
33
44
|
fn second_deriv(f_plus: int, f0: int, f_minus: int, h_fx: int): int {
|
|
34
45
|
if (h_fx == 0) { return 0; }
|
|
35
46
|
return (f_plus - 2 * f0 + f_minus) * 100000000 / h_fx / h_fx;
|
|
@@ -40,10 +51,15 @@ fn second_deriv(f_plus: int, f0: int, f_minus: int, h_fx: int): int {
|
|
|
40
51
|
// For integration, the user provides an array of function values at equally
|
|
41
52
|
// spaced points, and the step size.
|
|
42
53
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
54
|
+
/// Numerical integration using the trapezoidal rule.
|
|
55
|
+
/// @since 1.3.0
|
|
56
|
+
/// @param vals Array of n function values × 10000 at equally spaced points
|
|
57
|
+
/// @param n Number of sample points (must be ≥ 2)
|
|
58
|
+
/// @param h_fx Step width between samples × 10000
|
|
59
|
+
/// @returns Approximate integral × 10000 (area under the curve)
|
|
60
|
+
/// @example
|
|
61
|
+
/// let ys: int[] = [0, 5000, 10000]; // f(0)=0, f(0.5)=0.5, f(1)=1 (linear)
|
|
62
|
+
/// let area: int = integrate_trapezoid(ys, 3, 5000); // ≈ 5000 (∫₀¹ x dx = 0.5)
|
|
47
63
|
fn integrate_trapezoid(vals: int[], n: int, h_fx: int): int {
|
|
48
64
|
if (n < 2) { return 0; }
|
|
49
65
|
// Sum = (vals[0] + vals[n-1]) / 2 + vals[1] + vals[2] + ... + vals[n-2]
|
|
@@ -56,8 +72,13 @@ fn integrate_trapezoid(vals: int[], n: int, h_fx: int): int {
|
|
|
56
72
|
return sum * h_fx / 10000;
|
|
57
73
|
}
|
|
58
74
|
|
|
59
|
-
|
|
60
|
-
|
|
75
|
+
/// Numerical integration using Simpson's 1/3 rule (more accurate than trapezoid for smooth functions).
|
|
76
|
+
/// Uses n−1 intervals if n is even. Requires n ≥ 3.
|
|
77
|
+
/// @since 1.3.0
|
|
78
|
+
/// @param vals Array of n function values × 10000 at equally spaced points
|
|
79
|
+
/// @param n Number of sample points (should be odd and ≥ 3)
|
|
80
|
+
/// @param h_fx Step width × 10000
|
|
81
|
+
/// @returns Approximate integral × 10000
|
|
61
82
|
fn integrate_simpson(vals: int[], n: int, h_fx: int): int {
|
|
62
83
|
if (n < 3) { return integrate_trapezoid(vals, n, h_fx); }
|
|
63
84
|
// Ensure n is odd by using n-1 if even
|
|
@@ -80,7 +101,12 @@ fn integrate_simpson(vals: int[], n: int, h_fx: int): int {
|
|
|
80
101
|
|
|
81
102
|
// ─── Riemann sums ─────────────────────────────────────────────────────────────
|
|
82
103
|
|
|
83
|
-
|
|
104
|
+
/// Left Riemann sum: sum of f(x_i) × h for i = 0 … n−2.
|
|
105
|
+
/// @since 1.3.0
|
|
106
|
+
/// @param vals Array of n function values × 10000
|
|
107
|
+
/// @param n Number of sample points
|
|
108
|
+
/// @param h_fx Step width × 10000
|
|
109
|
+
/// @returns Approximate integral × 10000
|
|
84
110
|
fn riemann_left(vals: int[], n: int, h_fx: int): int {
|
|
85
111
|
let sum: int = 0;
|
|
86
112
|
let i: int = 0;
|
|
@@ -88,7 +114,12 @@ fn riemann_left(vals: int[], n: int, h_fx: int): int {
|
|
|
88
114
|
return sum * h_fx / 10000;
|
|
89
115
|
}
|
|
90
116
|
|
|
91
|
-
|
|
117
|
+
/// Right Riemann sum: sum of f(x_i) × h for i = 1 … n−1.
|
|
118
|
+
/// @since 1.3.0
|
|
119
|
+
/// @param vals Array of n function values × 10000
|
|
120
|
+
/// @param n Number of sample points
|
|
121
|
+
/// @param h_fx Step width × 10000
|
|
122
|
+
/// @returns Approximate integral × 10000
|
|
92
123
|
fn riemann_right(vals: int[], n: int, h_fx: int): int {
|
|
93
124
|
let sum: int = 0;
|
|
94
125
|
let i: int = 1;
|
|
@@ -96,8 +127,12 @@ fn riemann_right(vals: int[], n: int, h_fx: int): int {
|
|
|
96
127
|
return sum * h_fx / 10000;
|
|
97
128
|
}
|
|
98
129
|
|
|
99
|
-
|
|
100
|
-
|
|
130
|
+
/// Midpoint Riemann sum using precomputed midpoint values.
|
|
131
|
+
/// @since 1.3.0
|
|
132
|
+
/// @param vals Array of n midpoint values × 10000 (one per interval)
|
|
133
|
+
/// @param n Number of intervals (i.e. length of vals)
|
|
134
|
+
/// @param h_fx Step width × 10000
|
|
135
|
+
/// @returns Approximate integral × 10000
|
|
101
136
|
fn riemann_mid(vals: int[], n: int, h_fx: int): int {
|
|
102
137
|
let sum: int = 0;
|
|
103
138
|
let i: int = 0;
|
|
@@ -107,8 +142,12 @@ fn riemann_mid(vals: int[], n: int, h_fx: int): int {
|
|
|
107
142
|
|
|
108
143
|
// ─── Curve length ────────────────────────────────────────────────────────────
|
|
109
144
|
|
|
110
|
-
|
|
111
|
-
|
|
145
|
+
/// Approximate arc length of a 2-D polyline through n points using the Euclidean distance between consecutive points.
|
|
146
|
+
/// @since 1.3.0
|
|
147
|
+
/// @param xs X coordinates × 10000 of the n points
|
|
148
|
+
/// @param ys Y coordinates × 10000 of the n points
|
|
149
|
+
/// @param n Number of points (must be ≥ 2)
|
|
150
|
+
/// @returns Approximate arc length × 10000
|
|
112
151
|
fn curve_length_2d(xs: int[], ys: int[], n: int): int {
|
|
113
152
|
let total: int = 0;
|
|
114
153
|
let i: int = 0;
|
|
@@ -124,26 +163,43 @@ fn curve_length_2d(xs: int[], ys: int[], n: int): int {
|
|
|
124
163
|
|
|
125
164
|
// ─── Running statistics ───────────────────────────────────────────────────────
|
|
126
165
|
|
|
127
|
-
|
|
128
|
-
|
|
166
|
+
/// Welford's online algorithm: update a running mean with a new sample.
|
|
167
|
+
/// @since 1.3.0
|
|
168
|
+
/// @param prev_mean Previous mean × 10000
|
|
169
|
+
/// @param new_val New sample value × 10000
|
|
170
|
+
/// @param n Total count after adding the new sample (n ≥ 1)
|
|
171
|
+
/// @returns Updated mean × 10000
|
|
129
172
|
fn running_mean(prev_mean: int, new_val: int, n: int): int {
|
|
130
173
|
if (n <= 1) { return new_val; }
|
|
131
174
|
return prev_mean + (new_val - prev_mean) * 10000 / (n * 10000);
|
|
132
175
|
}
|
|
133
176
|
|
|
134
|
-
|
|
135
|
-
|
|
177
|
+
/// Welford's online algorithm: update the M2 accumulator used to compute variance.
|
|
178
|
+
/// Variance = running_m2 / (n − 1) after n samples.
|
|
179
|
+
/// @since 1.3.0
|
|
180
|
+
/// @param prev_m2 Previous M2 accumulator × 10000
|
|
181
|
+
/// @param prev_mean Mean before adding the new sample × 10000
|
|
182
|
+
/// @param new_mean Mean after adding the new sample × 10000
|
|
183
|
+
/// @param new_val New sample value × 10000
|
|
184
|
+
/// @returns Updated M2 accumulator × 10000
|
|
136
185
|
fn running_m2(prev_m2: int, prev_mean: int, new_mean: int, new_val: int): int {
|
|
137
186
|
return prev_m2 + (new_val - prev_mean) * (new_val - new_mean) / 10000;
|
|
138
187
|
}
|
|
139
188
|
|
|
140
|
-
|
|
189
|
+
/// Compute sample variance from a Welford M2 accumulator and sample count.
|
|
190
|
+
/// @since 1.3.0
|
|
191
|
+
/// @param m2 M2 accumulator from `running_m2` × 10000
|
|
192
|
+
/// @param n Number of samples collected
|
|
193
|
+
/// @returns Sample variance × 10000; returns 0 for n ≤ 1
|
|
141
194
|
fn variance_from_m2(m2: int, n: int): int {
|
|
142
195
|
if (n <= 1) { return 0; }
|
|
143
196
|
return m2 / (n - 1);
|
|
144
197
|
}
|
|
145
198
|
|
|
146
|
-
|
|
199
|
+
/// Approximate standard deviation as the integer square root of the variance.
|
|
200
|
+
/// @since 1.3.0
|
|
201
|
+
/// @param variance_fx Variance × 10000 (e.g. from `variance_from_m2`)
|
|
202
|
+
/// @returns √variance × 10000; returns 0 for non-positive input
|
|
147
203
|
fn std_dev_approx(variance_fx: int): int {
|
|
148
204
|
if (variance_fx <= 0) { return 0; }
|
|
149
205
|
return isqrt(variance_fx * 100) * 100 / 10000;
|