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