sonolus.py 0.4.1__tar.gz → 0.4.2__tar.gz
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.
Potentially problematic release.
This version of sonolus.py might be problematic. Click here for more details.
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/PKG-INFO +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/constructs.md +3 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/types.md +3 -6
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/index.md +8 -3
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/overview.md +19 -23
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/pyproject.toml +2 -2
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/utils.py +15 -24
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/visitor.py +8 -2
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/cli.py +3 -3
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/compile.py +16 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/archetype.py +21 -12
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/array.py +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/containers.py +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/easing.py +0 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/effect.py +4 -2
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/globals.py +5 -2
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/context.py +7 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/native.py +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/iterator.py +4 -2
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/maybe.py +15 -12
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/sprite.py +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/stream.py +6 -5
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/uv.lock +1 -1
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.gitattributes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.github/workflows/publish.yaml +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.gitignore +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.python-version +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.run/Python tests in tests.run.xml +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/LICENSE +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/README.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/builtins.pyi +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/math.pyi +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/num.pyi +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/random.pyi +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/CNAME +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/builtins.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/cli.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/index.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/project.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/resources.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/builtins.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/index.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/math.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/random.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.archetype.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.array.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.array_like.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.bucket.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.containers.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.debug.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.easing.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.effect.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.engine.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.globals.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.instruction.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.interval.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.iterator.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.level.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.maybe.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.metadata.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.num.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.options.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.particle.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.printing.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.project.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.quad.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.record.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.runtime.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.sprite.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.stream.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.text.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.timing.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.transform.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.ui.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.values.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.vec.md +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/mkdocs.yml +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/generate.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Engine/Tutorial/Blocks.json +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Functions.json +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Play/Blocks.json +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Preview/Blocks.json +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Watch/Blocks.json +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/blocks.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/excepthook.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/finalize.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/interpret.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/ir.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/mode.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/node.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/ops.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/allocate.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/constant_evaluation.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/copy_coalesce.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/dead_code.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/dominance.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/flow.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/inlining.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/liveness.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/optimize.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/passes.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/simplify.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/ssa.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/place.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/collection.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/engine.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/level.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/node.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/project.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/py.typed +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/array_like.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/bucket.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/debug.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/engine.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/instruction.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/builtin_impls.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/callbacks.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/constant.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/descriptor.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/dict_impl.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/error.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/generic.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/impl.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/introspection.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/math_impls.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/random.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/range.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/simulation_context.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/transient.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/tuple_impl.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/value.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/interval.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/level.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/metadata.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/num.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/options.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/particle.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/pointer.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/printing.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/project.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/quad.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/record.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/runtime.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/text.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/timing.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/transform.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/ui.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/values.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/vec.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/level.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/buckets.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/connector.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/effect.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/layer.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/layout.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/note.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/options.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/particle.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/skin.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/stage.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/streams.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/ui.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/connector.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/event.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/input.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/mode.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/note.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/stage.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/connector.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/event.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/layout.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/mode.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/note.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/stage.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/project.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/framework.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/instructions.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/intro.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/mode.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/navigate.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/painting.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/phases.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/preprocess.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/update.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/connector.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/event.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/mode.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/note.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/stage.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/update_spawn.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/conftest.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_fast_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_fast_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_standard_nodes +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_standard_optimized_cfg +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/test_project.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/__init__.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/conftest.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array_map.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array_set.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_assert.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_dict.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_flow.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_functions.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_generator.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_genexpr.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_helpers.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_interval.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_match.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_maybe.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_num.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_operator.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_quad.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_random.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_range.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_record.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_transform.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_tuple.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_values.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_var_array.py +0 -0
- {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_vec.py +0 -0
|
@@ -394,7 +394,9 @@ def g(a):
|
|
|
394
394
|
|
|
395
395
|
Function returns follow the same rules as variable access. If a function returns a non-num value, it most only
|
|
396
396
|
return that value. If the function always returns a num, it may have any number of returns. Similarly, if a function
|
|
397
|
-
always returns None (`return None` or just `return`), it may have any number of returns.
|
|
397
|
+
always returns None (`return None` or just `return`), it may have any number of returns.
|
|
398
|
+
The [`Maybe`][sonolus.script.maybe.Maybe] is also an exception, see the
|
|
399
|
+
[Maybe documentation](../reference/sonolus.script.maybe.md) for details
|
|
398
400
|
|
|
399
401
|
The following are allowed:
|
|
400
402
|
|
|
@@ -118,13 +118,10 @@ a2 = Array[int, 0]()
|
|
|
118
118
|
a3 = +Array[int, 3] # Create a zero-initialized array
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
-
For type checker compatibility, `Literal` or [`Dim`][sonolus.script.array.Dim]
|
|
122
|
-
|
|
123
|
-
|
|
121
|
+
For type checker compatibility, the Python builtin `typing.Literal` or [`Dim`][sonolus.script.array.Dim] may be used
|
|
122
|
+
for an array's size:
|
|
124
123
|
```python
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
a1 = Array[int, Dim(3)](1, 2, 3)
|
|
124
|
+
a1 = Array[int, Dim[3]](1, 2, 3)
|
|
128
125
|
a2 = Array[int, Literal[3]](1, 2, 3)
|
|
129
126
|
```
|
|
130
127
|
|
|
@@ -13,12 +13,17 @@ Sonolus.py is available on PyPI and can be installed using a package manager lik
|
|
|
13
13
|
uv add sonolus.py
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
|
|
16
17
|
## Getting Started
|
|
17
|
-
Example Projects:
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Before making a new Sonolus.py engine or even reading through the rest of this documentation, it may be helpful to look
|
|
20
|
+
at some examples to get a sense of how Sonolus.py is used.
|
|
21
|
+
|
|
22
|
+
The [pydori](https://github.com/qwewqa/pydori) engine is an example Sonolus.py engine that implements a Bandori-style
|
|
23
|
+
(vertical scrolling rhythm game) engine.
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
Once you're ready to start a new project, you may want to use the
|
|
26
|
+
[new project template](https://github.com/qwewqa/sonolus.py-template-project).
|
|
22
27
|
|
|
23
28
|
## Documentation
|
|
24
29
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Overview
|
|
2
2
|
|
|
3
|
-
Sonolus.py is a Python library for creating Sonolus engines. This page provides an overview of the key functionality
|
|
4
|
-
available in the library. For
|
|
3
|
+
Sonolus.py is a Python library for creating Sonolus engines. This page provides an overview of the key functionality
|
|
4
|
+
available in the library. For detailed information, see the [Concepts](concepts/index.md) and
|
|
5
5
|
[Reference](reference/index.md) sections.
|
|
6
6
|
|
|
7
7
|
## Language
|
|
8
8
|
|
|
9
|
-
Sonolus.py
|
|
9
|
+
Sonolus.py compiles Python code into Sonolus nodes. It supports a subset of Python including
|
|
10
10
|
most syntax and a portion of the standard library. Additionally, Sonolus.py provides its own library of types and
|
|
11
|
-
functions that are
|
|
11
|
+
functions that are designed for use in Sonolus engines.
|
|
12
12
|
|
|
13
13
|
### Syntax
|
|
14
14
|
|
|
@@ -26,7 +26,7 @@ Most Python syntax is supported, but there are a few limitations. The primary re
|
|
|
26
26
|
Sonolus.py will evaluate some expressions at compile time such as basic arithmetic operations on constants,
|
|
27
27
|
boolean logical operations (`and`, `or`, `not`) on constants, and type checks (`isinstance`, `issubclass`).
|
|
28
28
|
|
|
29
|
-
In control flow constructs like `if` and `match`, Sonolus.py may determine some branches to be unreachable at compile
|
|
29
|
+
In control flow constructs like `if` and `match`, Sonolus.py may determine some branches to be unreachable at compile
|
|
30
30
|
and eliminate them without evaluating them. This allows code like the following to compile successfully:
|
|
31
31
|
|
|
32
32
|
```python
|
|
@@ -60,16 +60,16 @@ debug_log(a.x)
|
|
|
60
60
|
Similar to variables, functions returning `int`, `float`, or `bool` can have any number of return statements. Functions
|
|
61
61
|
returning `None` may also have any number of `return` or `return None` statements.
|
|
62
62
|
|
|
63
|
-
Functions returning any other type must have exactly one `return` statement, and it must be the only exit point of the
|
|
64
|
-
function. It is ok, however, for a function to have other `return` statements that are eliminated at compile time.
|
|
63
|
+
Functions returning any other type must have exactly one `return` statement, and it must be the only exit point of the
|
|
64
|
+
function [^1]. It is ok, however, for a function to have other `return` statements that are eliminated at compile time.
|
|
65
65
|
For example, the following code will compile successfully:
|
|
66
66
|
|
|
67
67
|
```python
|
|
68
68
|
def fn(a: int | Vec2):
|
|
69
69
|
if isinstance(a, Vec2):
|
|
70
|
-
return a.x
|
|
70
|
+
return Vec2(a.x, a.y)
|
|
71
71
|
else:
|
|
72
|
-
return a
|
|
72
|
+
return Vec2(a, a)
|
|
73
73
|
|
|
74
74
|
fn(123)
|
|
75
75
|
```
|
|
@@ -79,12 +79,12 @@ fn(123)
|
|
|
79
79
|
### Numbers
|
|
80
80
|
|
|
81
81
|
Sonolus.py supports `int`, `float`, and `bool` types and most of the standard operations such as mathematical operations
|
|
82
|
-
(`+`, `-`, `*`, `/`, `//`, `%`), comparisons (`<`, `<=`, `>`, `>=`, `==`, `!=`), and boolean operations
|
|
82
|
+
(`+`, `-`, `*`, `/`, `//`, `%`), comparisons (`<`, `<=`, `>`, `>=`, `==`, `!=`), and boolean operations
|
|
83
83
|
(`and`, `or`, `not`).
|
|
84
84
|
|
|
85
85
|
### Record
|
|
86
86
|
|
|
87
|
-
[`Record`](reference/sonolus.script.record.md) is the main way to define custom types in Sonolus.py.
|
|
87
|
+
[`Record`](reference/sonolus.script.record.md) is the main way to define custom types in Sonolus.py.
|
|
88
88
|
It functions similarly to a data class and provides a way to define a type with named fields:
|
|
89
89
|
|
|
90
90
|
```python
|
|
@@ -116,7 +116,7 @@ assert record_1.a == record_2.value.a == 789
|
|
|
116
116
|
|
|
117
117
|
### Array
|
|
118
118
|
|
|
119
|
-
[`Array`](reference/sonolus.script.array.md) is a type that represents a fixed-size array of elements of a
|
|
119
|
+
[`Array`](reference/sonolus.script.array.md) is a type that represents a fixed-size array of elements of a
|
|
120
120
|
specific type:
|
|
121
121
|
|
|
122
122
|
```python
|
|
@@ -162,7 +162,7 @@ record_2 = +Array[int, 3]
|
|
|
162
162
|
Records and arrays can be mutated in-place using the `@=` operator:
|
|
163
163
|
|
|
164
164
|
```python
|
|
165
|
-
record_1 @= MyRecord(1, 2.3)
|
|
165
|
+
record_1 @= MyRecord(1, 2.3)
|
|
166
166
|
array_1 @= Array(4, 5, 6)
|
|
167
167
|
```
|
|
168
168
|
|
|
@@ -192,10 +192,12 @@ assert record_1 == array_1[0] == MyRecord(4, 5.6)
|
|
|
192
192
|
```
|
|
193
193
|
|
|
194
194
|
### Other Types
|
|
195
|
+
|
|
195
196
|
Sonolus.py has limited support for other types of values such as strings, tuples, and functions. These have restrictions
|
|
196
197
|
such as not being valid as Record field types or Array element types.
|
|
197
198
|
|
|
198
199
|
## Modules
|
|
200
|
+
|
|
199
201
|
Sonolus.py provides a number of built-in modules that can be used in Sonolus engines. These include:
|
|
200
202
|
|
|
201
203
|
- Project
|
|
@@ -227,7 +229,7 @@ Sonolus.py provides a number of built-in modules that can be used in Sonolus eng
|
|
|
227
229
|
- [random](reference/random.md): Supported random functions.
|
|
228
230
|
- Utilities
|
|
229
231
|
- [ArrayLike](reference/sonolus.script.array_like.md): Mixin for array functionality.
|
|
230
|
-
- [Containers](reference/sonolus.script.containers.md): Additional container types like `VarArray` and `ArrayMap
|
|
232
|
+
- [Containers](reference/sonolus.script.containers.md): Additional container types like [`VarArray`][sonolus.script.containers.VarArray] and [`ArrayMap`][sonolus.script.containers.ArrayMap].
|
|
231
233
|
- [Debug](reference/sonolus.script.debug.md): Debugging utilities.
|
|
232
234
|
- [Easing](reference/sonolus.script.easing.md): Easing functions for animations.
|
|
233
235
|
- [Interval](reference/sonolus.script.interval.md): Mathematical intervals.
|
|
@@ -241,12 +243,6 @@ Sonolus.py provides a number of built-in modules that can be used in Sonolus eng
|
|
|
241
243
|
|
|
242
244
|
For more details, see the [Reference](reference/index.md) section.
|
|
243
245
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
the library:
|
|
248
|
-
|
|
249
|
-
- [pydori](https://github.com/qwewqa/pydori): A Bandori-like engine designed to be an example project for Sonolus.py.
|
|
250
|
-
|
|
251
|
-
If you're starting a new project, you'll probably want to use the
|
|
252
|
-
[new project template](https://github.com/qwewqa/sonolus.py-template-project).
|
|
246
|
+
[^1]:
|
|
247
|
+
The [`Maybe`][sonolus.script.maybe.Maybe] type is an exception to this rule.
|
|
248
|
+
See the [`Maybe` documentation](reference/sonolus.script.maybe.md) for details.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sonolus.py"
|
|
3
|
-
version = "0.4.
|
|
3
|
+
version = "0.4.2"
|
|
4
4
|
description = "Sonolus engine development in Python"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -18,7 +18,7 @@ target-version = "py312"
|
|
|
18
18
|
[tool.ruff.lint]
|
|
19
19
|
preview = true
|
|
20
20
|
select = ["F", "E", "W", "I", "N", "D", "UP", "YTT", "B", "A", "COM", "C4", "DTZ", "PIE", "PT", "Q", "SLOT", "SIM", "PTH", "PL", "PERF", "FURB", "LOG", "RUF"]
|
|
21
|
-
ignore = ["E402", "D1", "COM812", "PLW2901", "PLW3201", "PLR6301", "PLC0415", "PLR2004", "PLR09", "SIM108", "FURB113", "A005", "B903", "FURB118"]
|
|
21
|
+
ignore = ["E402", "D1", "COM812", "PLW2901", "PLW3201", "PLR6301", "PLC0415", "PLR2004", "PLR09", "SIM108", "FURB113", "A005", "B903", "FURB118", "E501"]
|
|
22
22
|
|
|
23
23
|
[tool.ruff.lint.pydocstyle]
|
|
24
24
|
convention = "google"
|
|
@@ -24,14 +24,29 @@ class FindFunction(ast.NodeVisitor):
|
|
|
24
24
|
def __init__(self, line):
|
|
25
25
|
self.line = line
|
|
26
26
|
self.results: list[ast.FunctionDef | ast.Lambda] = []
|
|
27
|
+
self.current_fn = None
|
|
27
28
|
|
|
28
29
|
def visit_FunctionDef(self, node: ast.FunctionDef):
|
|
29
30
|
self.results.append(node)
|
|
31
|
+
outer_fn = self.current_fn
|
|
32
|
+
self.current_fn = node
|
|
30
33
|
self.generic_visit(node)
|
|
34
|
+
self.current_fn = outer_fn
|
|
31
35
|
|
|
32
36
|
def visit_Lambda(self, node: ast.Lambda):
|
|
33
37
|
self.results.append(node)
|
|
38
|
+
outer_fn = self.current_fn
|
|
39
|
+
self.current_fn = node
|
|
34
40
|
self.generic_visit(node)
|
|
41
|
+
self.current_fn = outer_fn
|
|
42
|
+
|
|
43
|
+
# Visitors have high overhead, so we detect generators here rather than in a separate pass.
|
|
44
|
+
|
|
45
|
+
def visit_Yield(self, node):
|
|
46
|
+
self.current_fn.has_yield = True
|
|
47
|
+
|
|
48
|
+
def visit_YieldFrom(self, node):
|
|
49
|
+
self.current_fn.has_yield = True
|
|
35
50
|
|
|
36
51
|
|
|
37
52
|
@cache
|
|
@@ -65,27 +80,3 @@ def scan_writes(node: ast.AST) -> set[str]:
|
|
|
65
80
|
visitor = ScanWrites()
|
|
66
81
|
visitor.visit(node)
|
|
67
82
|
return set(visitor.writes)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class HasDirectYield(ast.NodeVisitor):
|
|
71
|
-
def __init__(self):
|
|
72
|
-
self.started = False
|
|
73
|
-
self.has_yield = False
|
|
74
|
-
|
|
75
|
-
def visit_Yield(self, node: ast.Yield):
|
|
76
|
-
self.has_yield = True
|
|
77
|
-
|
|
78
|
-
def visit_YieldFrom(self, node: ast.YieldFrom):
|
|
79
|
-
self.has_yield = True
|
|
80
|
-
|
|
81
|
-
def visit_FunctionDef(self, node: ast.FunctionDef):
|
|
82
|
-
if self.started:
|
|
83
|
-
return
|
|
84
|
-
self.started = True
|
|
85
|
-
self.generic_visit(node)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def has_yield(node: ast.AST) -> bool:
|
|
89
|
-
visitor = HasDirectYield()
|
|
90
|
-
visitor.visit(node)
|
|
91
|
-
return visitor.has_yield
|
|
@@ -11,7 +11,7 @@ from types import FunctionType, MethodType, MethodWrapperType
|
|
|
11
11
|
from typing import Any, Never
|
|
12
12
|
|
|
13
13
|
from sonolus.backend.excepthook import install_excepthook
|
|
14
|
-
from sonolus.backend.utils import get_function,
|
|
14
|
+
from sonolus.backend.utils import get_function, scan_writes
|
|
15
15
|
from sonolus.script.debug import assert_true
|
|
16
16
|
from sonolus.script.internal.builtin_impls import BUILTIN_IMPLS, _bool, _float, _int, _len
|
|
17
17
|
from sonolus.script.internal.constant import ConstantValue
|
|
@@ -39,6 +39,8 @@ def compile_and_call[**P, R](fn: Callable[P, R], /, *args: P.args, **kwargs: P.k
|
|
|
39
39
|
def compile_and_call_at_definition[**P, R](fn: Callable[P, R], /, *args: P.args, **kwargs: P.kwargs) -> R:
|
|
40
40
|
if not ctx():
|
|
41
41
|
return fn(*args, **kwargs)
|
|
42
|
+
if ctx().no_eval:
|
|
43
|
+
return compile_and_call(fn, *args, **kwargs)
|
|
42
44
|
source_file, node = get_function(fn)
|
|
43
45
|
location_args = {
|
|
44
46
|
"lineno": node.lineno,
|
|
@@ -279,7 +281,8 @@ class Visitor(ast.NodeVisitor):
|
|
|
279
281
|
ctx().scope.set_value("$return", validate_value(None))
|
|
280
282
|
case _:
|
|
281
283
|
raise NotImplementedError("Unsupported syntax")
|
|
282
|
-
|
|
284
|
+
# has_yield is set by the find_function visitor
|
|
285
|
+
if getattr(node, "has_yield", False) or isinstance(node, ast.GeneratorExp):
|
|
283
286
|
return_ctx = Context.meet([*self.return_ctxs, ctx()])
|
|
284
287
|
result_binding = return_ctx.scope.get_binding("$return")
|
|
285
288
|
if not isinstance(result_binding, ValueBinding):
|
|
@@ -1423,6 +1426,9 @@ class Visitor(ast.NodeVisitor):
|
|
|
1423
1426
|
self, node: ast.stmt | ast.expr, fn: Callable[P, R], /, *args: P.args, **kwargs: P.kwargs
|
|
1424
1427
|
) -> R:
|
|
1425
1428
|
"""Executes the given function at the given node for a better traceback."""
|
|
1429
|
+
if ctx().no_eval:
|
|
1430
|
+
return fn(*args, **kwargs)
|
|
1431
|
+
|
|
1426
1432
|
location_args = {
|
|
1427
1433
|
"lineno": node.lineno,
|
|
1428
1434
|
"col_offset": node.col_offset,
|
|
@@ -166,13 +166,13 @@ def main():
|
|
|
166
166
|
def add_common_arguments(parser):
|
|
167
167
|
optimization_group = parser.add_mutually_exclusive_group()
|
|
168
168
|
optimization_group.add_argument(
|
|
169
|
-
"-
|
|
169
|
+
"-O0", "--optimize-minimal", action="store_true", help="Use minimal optimization passes"
|
|
170
170
|
)
|
|
171
171
|
optimization_group.add_argument(
|
|
172
|
-
"-
|
|
172
|
+
"-O1", "--optimize-fast", action="store_true", help="Use fast optimization passes"
|
|
173
173
|
)
|
|
174
174
|
optimization_group.add_argument(
|
|
175
|
-
"-
|
|
175
|
+
"-O2", "--optimize-standard", action="store_true", help="Use standard optimization passes"
|
|
176
176
|
)
|
|
177
177
|
|
|
178
178
|
build_components = parser.add_argument_group("build components")
|
|
@@ -21,6 +21,7 @@ from sonolus.script.internal.context import (
|
|
|
21
21
|
ctx,
|
|
22
22
|
using_ctx,
|
|
23
23
|
)
|
|
24
|
+
from sonolus.script.internal.error import CompilationError
|
|
24
25
|
from sonolus.script.num import _is_num
|
|
25
26
|
|
|
26
27
|
|
|
@@ -140,7 +141,21 @@ def callback_to_cfg(
|
|
|
140
141
|
name: str,
|
|
141
142
|
archetype: type[_BaseArchetype] | None = None,
|
|
142
143
|
) -> BasicBlock:
|
|
143
|
-
|
|
144
|
+
try:
|
|
145
|
+
# Default to no_eval=True for performance unless there's an error.
|
|
146
|
+
return _callback_to_cfg(global_state, callback, name, archetype, no_eval=True)
|
|
147
|
+
except CompilationError:
|
|
148
|
+
return _callback_to_cfg(global_state, callback, name, archetype, no_eval=False)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _callback_to_cfg(
|
|
152
|
+
global_state: GlobalContextState,
|
|
153
|
+
callback: Callable,
|
|
154
|
+
name: str,
|
|
155
|
+
archetype: type[_BaseArchetype] | None,
|
|
156
|
+
no_eval: bool,
|
|
157
|
+
) -> BasicBlock:
|
|
158
|
+
callback_state = CallbackContextState(name, no_eval=no_eval)
|
|
144
159
|
context = Context(global_state, callback_state)
|
|
145
160
|
with using_ctx(context):
|
|
146
161
|
if archetype is not None:
|
|
@@ -190,7 +190,8 @@ def imported(*, name: str | None = None) -> Any:
|
|
|
190
190
|
|
|
191
191
|
In watch mode, data may also be loaded from a corresponding exported field in play mode.
|
|
192
192
|
|
|
193
|
-
Imported fields may only be updated in the `preprocess`
|
|
193
|
+
Imported fields may only be updated in the [`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess]
|
|
194
|
+
callback, and are read-only in other callbacks.
|
|
194
195
|
|
|
195
196
|
Usage:
|
|
196
197
|
```python
|
|
@@ -205,10 +206,12 @@ def imported(*, name: str | None = None) -> Any:
|
|
|
205
206
|
def entity_data() -> Any:
|
|
206
207
|
"""Declare a field as entity data.
|
|
207
208
|
|
|
208
|
-
Entity data is accessible from other entities, but may only be updated in the
|
|
209
|
+
Entity data is accessible from other entities, but may only be updated in the
|
|
210
|
+
[`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess] callback
|
|
209
211
|
and is read-only in other callbacks.
|
|
210
212
|
|
|
211
|
-
It functions like `imported` and shares the same underlying storage,
|
|
213
|
+
It functions like [`imported`][sonolus.script.archetype.imported] and shares the same underlying storage,
|
|
214
|
+
except that it is not loaded from a level.
|
|
212
215
|
|
|
213
216
|
Usage:
|
|
214
217
|
```python
|
|
@@ -242,7 +245,8 @@ def entity_memory() -> Any:
|
|
|
242
245
|
Entity memory is private to the entity and is not accessible from other entities. It may be read or updated in any
|
|
243
246
|
callback associated with the entity.
|
|
244
247
|
|
|
245
|
-
Entity memory fields may also be set when an entity is spawned using the
|
|
248
|
+
Entity memory fields may also be set when an entity is spawned using the
|
|
249
|
+
[`spawn()`][sonolus.script.archetype.PlayArchetype.spawn] method.
|
|
246
250
|
|
|
247
251
|
Usage:
|
|
248
252
|
```python
|
|
@@ -260,7 +264,9 @@ def shared_memory() -> Any:
|
|
|
260
264
|
Shared memory is accessible from other entities.
|
|
261
265
|
|
|
262
266
|
Shared memory may be read in any callback, but may only be updated by sequential callbacks
|
|
263
|
-
(`preprocess
|
|
267
|
+
([`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess],
|
|
268
|
+
[`update_sequential`][sonolus.script.archetype.PlayArchetype.update_sequential],
|
|
269
|
+
and [`touch`][sonolus.script.archetype.PlayArchetype.touch]).
|
|
264
270
|
|
|
265
271
|
Usage:
|
|
266
272
|
```python
|
|
@@ -688,7 +694,7 @@ class PlayArchetype(_BaseArchetype):
|
|
|
688
694
|
def spawn_order(self) -> float:
|
|
689
695
|
"""Return the spawn order of the entity.
|
|
690
696
|
|
|
691
|
-
Runs when the level is loaded after `preprocess
|
|
697
|
+
Runs when the level is loaded after [`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess].
|
|
692
698
|
"""
|
|
693
699
|
|
|
694
700
|
def should_spawn(self) -> bool:
|
|
@@ -709,13 +715,15 @@ class PlayArchetype(_BaseArchetype):
|
|
|
709
715
|
Runs first each frame.
|
|
710
716
|
|
|
711
717
|
This is where logic affecting shared memory should be placed.
|
|
712
|
-
Other logic should be placed in
|
|
718
|
+
Other logic should typically be placed in
|
|
719
|
+
[`update_parallel`][sonolus.script.archetype.PlayArchetype.update_parallel]
|
|
720
|
+
for better performance.
|
|
713
721
|
"""
|
|
714
722
|
|
|
715
723
|
def update_parallel(self):
|
|
716
724
|
"""Perform parallel actions for this frame.
|
|
717
725
|
|
|
718
|
-
Runs after `touch` each frame.
|
|
726
|
+
Runs after [`touch`][sonolus.script.archetype.PlayArchetype.touch] each frame.
|
|
719
727
|
|
|
720
728
|
This is where most gameplay logic should be placed.
|
|
721
729
|
"""
|
|
@@ -723,7 +731,7 @@ class PlayArchetype(_BaseArchetype):
|
|
|
723
731
|
def touch(self):
|
|
724
732
|
"""Handle user input.
|
|
725
733
|
|
|
726
|
-
Runs after `update_sequential` each frame.
|
|
734
|
+
Runs after [`update_sequential`][sonolus.script.archetype.PlayArchetype.update_sequential] each frame.
|
|
727
735
|
"""
|
|
728
736
|
|
|
729
737
|
def terminate(self):
|
|
@@ -863,13 +871,14 @@ class WatchArchetype(_BaseArchetype):
|
|
|
863
871
|
Runs first each frame.
|
|
864
872
|
|
|
865
873
|
This is where logic affecting shared memory should be placed.
|
|
866
|
-
Other logic should be placed in
|
|
874
|
+
Other logic should typically be placed in
|
|
875
|
+
[`update_parallel`][sonolus.script.archetype.PlayArchetype.update_parallel] for better performance.
|
|
867
876
|
"""
|
|
868
877
|
|
|
869
878
|
def update_parallel(self):
|
|
870
879
|
"""Parallel update callback.
|
|
871
880
|
|
|
872
|
-
Runs after `touch` each frame.
|
|
881
|
+
Runs after [`touch`][sonolus.script.archetype.PlayArchetype.touch] each frame.
|
|
873
882
|
|
|
874
883
|
This is where most gameplay logic should be placed.
|
|
875
884
|
"""
|
|
@@ -1094,7 +1103,7 @@ class WatchEntityInput(Record):
|
|
|
1094
1103
|
class EntityRef[A: _BaseArchetype](Record):
|
|
1095
1104
|
"""Reference to another entity.
|
|
1096
1105
|
|
|
1097
|
-
May be used with `Any` to reference an unknown archetype.
|
|
1106
|
+
May be used with `typing.Any` to reference an unknown archetype.
|
|
1098
1107
|
|
|
1099
1108
|
Usage:
|
|
1100
1109
|
```python
|
|
@@ -16,7 +16,7 @@ from sonolus.script.internal.value import BackingSource, DataValue, Value
|
|
|
16
16
|
from sonolus.script.num import Num
|
|
17
17
|
|
|
18
18
|
Dim = Literal
|
|
19
|
-
"""Shorthand for `Literal` intended for use in array dimensions for type checker compatibility."""
|
|
19
|
+
"""Shorthand for `typing.Literal` intended for use in array dimensions for type checker compatibility."""
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class ArrayMeta(ABCMeta):
|
|
@@ -38,7 +38,8 @@ class Effect(Record):
|
|
|
38
38
|
def schedule(self, time: float, distance: float = 0) -> None:
|
|
39
39
|
"""Schedule the effect clip to play at a specific time.
|
|
40
40
|
|
|
41
|
-
This is not suitable for real-time effects such as responses to user input.
|
|
41
|
+
This is not suitable for real-time effects such as responses to user input.
|
|
42
|
+
Use [`play`][sonolus.script.effect.Effect.play] instead.
|
|
42
43
|
|
|
43
44
|
This may be called in preprocess to schedule effects upfront.
|
|
44
45
|
|
|
@@ -61,7 +62,8 @@ class Effect(Record):
|
|
|
61
62
|
def schedule_loop(self, start_time: float) -> ScheduledLoopedEffectHandle:
|
|
62
63
|
"""Schedule the effect clip to play in a loop until stopped.
|
|
63
64
|
|
|
64
|
-
This is not suitable for real-time effects such as responses to user input.
|
|
65
|
+
This is not suitable for real-time effects such as responses to user input.
|
|
66
|
+
Use [`loop`][sonolus.script.effect.Effect.loop] instead.
|
|
65
67
|
|
|
66
68
|
Returns:
|
|
67
69
|
A handle to stop the loop.
|
|
@@ -235,7 +235,10 @@ def _tutorial_instruction[T](cls: type[T]) -> T:
|
|
|
235
235
|
def level_memory[T](cls: type[T]) -> T:
|
|
236
236
|
"""Define level memory.
|
|
237
237
|
|
|
238
|
-
Level memory may be modified during gameplay in sequential callbacks
|
|
238
|
+
Level memory may be modified during gameplay in sequential callbacks
|
|
239
|
+
([`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess],
|
|
240
|
+
[`update_sequential`][sonolus.script.archetype.PlayArchetype.update_sequential],
|
|
241
|
+
[`touch`][sonolus.script.archetype.PlayArchetype.touch]).
|
|
239
242
|
|
|
240
243
|
Usage:
|
|
241
244
|
```python
|
|
@@ -265,7 +268,7 @@ def level_memory[T](cls: type[T]) -> T:
|
|
|
265
268
|
def level_data[T](cls: type[T]) -> T:
|
|
266
269
|
"""Define level data.
|
|
267
270
|
|
|
268
|
-
Level data may only be modified during
|
|
271
|
+
Level data may only be modified during [`preprocess`][sonolus.script.archetype.PlayArchetype.preprocess].
|
|
269
272
|
|
|
270
273
|
Usage:
|
|
271
274
|
```python
|
|
@@ -61,10 +61,12 @@ class GlobalContextState:
|
|
|
61
61
|
class CallbackContextState:
|
|
62
62
|
callback: str
|
|
63
63
|
used_names: dict[str, int]
|
|
64
|
+
no_eval: bool
|
|
64
65
|
|
|
65
|
-
def __init__(self, callback: str):
|
|
66
|
+
def __init__(self, callback: str, no_eval: bool = False):
|
|
66
67
|
self.callback = callback
|
|
67
68
|
self.used_names = {}
|
|
69
|
+
self.no_eval = no_eval
|
|
68
70
|
|
|
69
71
|
|
|
70
72
|
class Context:
|
|
@@ -111,6 +113,10 @@ class Context:
|
|
|
111
113
|
def used_names(self) -> dict[str, int]:
|
|
112
114
|
return self.callback_state.used_names
|
|
113
115
|
|
|
116
|
+
@property
|
|
117
|
+
def no_eval(self) -> bool:
|
|
118
|
+
return self.callback_state.no_eval
|
|
119
|
+
|
|
114
120
|
def check_readable(self, place: BlockPlace):
|
|
115
121
|
if debug_config().unchecked_reads:
|
|
116
122
|
return
|
|
@@ -32,7 +32,7 @@ def native_function[**P, R](op: Op) -> Callable[[Callable[P, R]], Callable[P, R]
|
|
|
32
32
|
if ctx():
|
|
33
33
|
bound_args = signature.bind(*args)
|
|
34
34
|
bound_args.apply_defaults()
|
|
35
|
-
return native_call(op, *
|
|
35
|
+
return native_call(op, *bound_args.args)
|
|
36
36
|
return fn(*args) # type: ignore
|
|
37
37
|
|
|
38
38
|
return wrapper
|
|
@@ -14,7 +14,8 @@ class SonolusIterator[T]:
|
|
|
14
14
|
|
|
15
15
|
This class is used to define custom iterators that can be used in Sonolus.py.
|
|
16
16
|
|
|
17
|
-
Inheritors must implement the `next` method,
|
|
17
|
+
Inheritors must implement the [`next`][sonolus.script.iterator.SonolusIterator.next] method,
|
|
18
|
+
which should return a [`Maybe[T]`][sonolus.script.maybe.Maybe].
|
|
18
19
|
|
|
19
20
|
Usage:
|
|
20
21
|
```python
|
|
@@ -28,6 +29,7 @@ class SonolusIterator[T]:
|
|
|
28
29
|
|
|
29
30
|
@meta_fn
|
|
30
31
|
def next(self) -> Maybe[T]:
|
|
32
|
+
"""Return the next item from the iterator as a [`Maybe`][sonolus.script.maybe.Maybe]."""
|
|
31
33
|
raise NotImplementedError
|
|
32
34
|
|
|
33
35
|
def __next__(self) -> T:
|
|
@@ -120,7 +122,7 @@ class _FilteringIterator[T, Fn](Record, SonolusIterator):
|
|
|
120
122
|
|
|
121
123
|
@meta_fn
|
|
122
124
|
def maybe_next[T](iterator: Iterator[T]) -> Maybe[T]:
|
|
123
|
-
"""Get the next item from an iterator as a `Maybe`
|
|
125
|
+
"""Get the next item from an iterator as a [`Maybe`][sonolus.script.maybe.Maybe]."""
|
|
124
126
|
from sonolus.backend.visitor import compile_and_call
|
|
125
127
|
|
|
126
128
|
if not isinstance(iterator, SonolusIterator):
|
|
@@ -14,10 +14,11 @@ from sonolus.script.values import copy, zeros
|
|
|
14
14
|
class Maybe[T](TransientValue):
|
|
15
15
|
"""A type that either has a value or is empty.
|
|
16
16
|
|
|
17
|
-
Maybe has special behavior when returned from a function: it may be returned from
|
|
18
|
-
in a function, provided that all but one return statement returns the literal
|
|
17
|
+
`Maybe` has special behavior when returned from a function: unlike records and arrays, it may be returned from
|
|
18
|
+
multiple places in a function, provided that all but one return statement returns the literal
|
|
19
|
+
[`Nothing`][sonolus.script.maybe.Nothing].
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
Storing values of this type in a Record, Array, or Archetype is not supported.
|
|
21
22
|
|
|
22
23
|
Usage:
|
|
23
24
|
```python
|
|
@@ -73,28 +74,30 @@ class Maybe[T](TransientValue):
|
|
|
73
74
|
def map[R](self, fn: Callable[[T], R], /) -> Maybe[R]:
|
|
74
75
|
"""Map the contained value to a new value using the provided function.
|
|
75
76
|
|
|
76
|
-
If the value is not present, returns `Nothing
|
|
77
|
+
If the value is not present, returns [`Nothing`][sonolus.script.maybe.Nothing].
|
|
77
78
|
|
|
78
79
|
Args:
|
|
79
80
|
fn: A function that takes the contained value and returns a new value.
|
|
80
81
|
|
|
81
82
|
Returns:
|
|
82
|
-
A `Maybe` instance containing the result of the function if the value
|
|
83
|
+
A [`Maybe`][sonolus.script.maybe.Maybe] instance containing the result of the function if the value
|
|
84
|
+
is present, otherwise [`Nothing`][sonolus.script.maybe.Nothing].
|
|
83
85
|
"""
|
|
84
86
|
if self.is_some:
|
|
85
87
|
return Some(fn(self.get_unsafe()))
|
|
86
88
|
return Nothing
|
|
87
89
|
|
|
88
90
|
def flat_map[R](self, fn: Callable[[T], Maybe[R]], /) -> Maybe[R]:
|
|
89
|
-
"""Flat map the contained value to a new `Maybe` using the provided function.
|
|
91
|
+
"""Flat map the contained value to a new [`Maybe`][sonolus.script.maybe.Maybe] using the provided function.
|
|
90
92
|
|
|
91
|
-
If the value is not present, returns `Nothing
|
|
93
|
+
If the value is not present, returns [`Nothing`][sonolus.script.maybe.Nothing].
|
|
92
94
|
|
|
93
95
|
Args:
|
|
94
|
-
fn: A function that takes the contained value and returns a new `Maybe
|
|
96
|
+
fn: A function that takes the contained value and returns a new [`Maybe`][sonolus.script.maybe.Maybe].
|
|
95
97
|
|
|
96
98
|
Returns:
|
|
97
|
-
A `Maybe` instance containing the result of the function if the value
|
|
99
|
+
A [`Maybe`][sonolus.script.maybe.Maybe] instance containing the result of the function if the value
|
|
100
|
+
is present, otherwise [`Nothing`][sonolus.script.maybe.Nothing].
|
|
98
101
|
"""
|
|
99
102
|
if self.is_some:
|
|
100
103
|
return fn(self.get_unsafe())
|
|
@@ -216,13 +219,13 @@ class Maybe[T](TransientValue):
|
|
|
216
219
|
|
|
217
220
|
|
|
218
221
|
def Some[T](value: T) -> Maybe[T]: # noqa: N802
|
|
219
|
-
"""Create a `Maybe` instance with a value.
|
|
222
|
+
"""Create a [`Maybe`][sonolus.script.maybe.Maybe] instance with a value.
|
|
220
223
|
|
|
221
224
|
Args:
|
|
222
225
|
value: The contained value.
|
|
223
226
|
|
|
224
227
|
Returns:
|
|
225
|
-
A `Maybe` instance that contains the provided value.
|
|
228
|
+
A [`Maybe`][sonolus.script.maybe.Maybe] instance that contains the provided value.
|
|
226
229
|
"""
|
|
227
230
|
return Maybe(present=True, value=value)
|
|
228
231
|
|
|
@@ -231,7 +234,7 @@ Nothing: Maybe[Any] = Maybe(present=False, value=None) # type: ignore
|
|
|
231
234
|
|
|
232
235
|
# Note: has to come after the definition to hide the definition in the docs.
|
|
233
236
|
Nothing: Maybe[Any]
|
|
234
|
-
"""The empty `Maybe` instance."""
|
|
237
|
+
"""The empty [`Maybe`][sonolus.script.maybe.Maybe] instance."""
|
|
235
238
|
|
|
236
239
|
|
|
237
240
|
@meta_fn
|