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