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.

Files changed (612) hide show
  1. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/PKG-INFO +1 -1
  2. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/constructs.md +3 -1
  3. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/types.md +3 -6
  4. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/index.md +8 -3
  5. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/overview.md +19 -23
  6. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/pyproject.toml +2 -2
  7. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/utils.py +15 -24
  8. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/visitor.py +8 -2
  9. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/cli.py +3 -3
  10. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/compile.py +16 -1
  11. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/archetype.py +21 -12
  12. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/array.py +1 -1
  13. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/containers.py +1 -1
  14. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/easing.py +0 -1
  15. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/effect.py +4 -2
  16. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/globals.py +5 -2
  17. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/context.py +7 -1
  18. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/native.py +1 -1
  19. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/iterator.py +4 -2
  20. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/maybe.py +15 -12
  21. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/sprite.py +1 -1
  22. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/stream.py +6 -5
  23. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/uv.lock +1 -1
  24. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.gitattributes +0 -0
  25. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.github/workflows/publish.yaml +0 -0
  26. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.gitignore +0 -0
  27. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.python-version +0 -0
  28. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/.run/Python tests in tests.run.xml +0 -0
  29. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/LICENSE +0 -0
  30. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/README.md +0 -0
  31. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/__init__.py +0 -0
  32. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/builtins.pyi +0 -0
  33. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/math.pyi +0 -0
  34. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/num.pyi +0 -0
  35. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/doc_stubs/random.pyi +0 -0
  36. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/CNAME +0 -0
  37. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/builtins.md +0 -0
  38. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/cli.md +0 -0
  39. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/index.md +0 -0
  40. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/project.md +0 -0
  41. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/concepts/resources.md +0 -0
  42. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/builtins.md +0 -0
  43. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/index.md +0 -0
  44. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/math.md +0 -0
  45. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/random.md +0 -0
  46. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.archetype.md +0 -0
  47. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.array.md +0 -0
  48. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.array_like.md +0 -0
  49. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.bucket.md +0 -0
  50. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.containers.md +0 -0
  51. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.debug.md +0 -0
  52. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.easing.md +0 -0
  53. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.effect.md +0 -0
  54. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.engine.md +0 -0
  55. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.globals.md +0 -0
  56. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.instruction.md +0 -0
  57. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.interval.md +0 -0
  58. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.iterator.md +0 -0
  59. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.level.md +0 -0
  60. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.maybe.md +0 -0
  61. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.metadata.md +0 -0
  62. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.num.md +0 -0
  63. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.options.md +0 -0
  64. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.particle.md +0 -0
  65. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.printing.md +0 -0
  66. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.project.md +0 -0
  67. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.quad.md +0 -0
  68. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.record.md +0 -0
  69. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.runtime.md +0 -0
  70. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.sprite.md +0 -0
  71. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.stream.md +0 -0
  72. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.text.md +0 -0
  73. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.timing.md +0 -0
  74. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.transform.md +0 -0
  75. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.ui.md +0 -0
  76. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.values.md +0 -0
  77. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/docs/reference/sonolus.script.vec.md +0 -0
  78. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/mkdocs.yml +0 -0
  79. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/generate.py +0 -0
  80. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Engine/Tutorial/Blocks.json +0 -0
  81. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Functions.json +0 -0
  82. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Play/Blocks.json +0 -0
  83. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Preview/Blocks.json +0 -0
  84. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/scripts/runtimes/Level/Watch/Blocks.json +0 -0
  85. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/__init__.py +0 -0
  86. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/__init__.py +0 -0
  87. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/blocks.py +0 -0
  88. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/excepthook.py +0 -0
  89. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/finalize.py +0 -0
  90. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/interpret.py +0 -0
  91. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/ir.py +0 -0
  92. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/mode.py +0 -0
  93. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/node.py +0 -0
  94. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/ops.py +0 -0
  95. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/__init__.py +0 -0
  96. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/allocate.py +0 -0
  97. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/constant_evaluation.py +0 -0
  98. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/copy_coalesce.py +0 -0
  99. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/dead_code.py +0 -0
  100. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/dominance.py +0 -0
  101. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/flow.py +0 -0
  102. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/inlining.py +0 -0
  103. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/liveness.py +0 -0
  104. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/optimize.py +0 -0
  105. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/passes.py +0 -0
  106. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/simplify.py +0 -0
  107. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/optimize/ssa.py +0 -0
  108. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/backend/place.py +0 -0
  109. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/__init__.py +0 -0
  110. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/collection.py +0 -0
  111. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/engine.py +0 -0
  112. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/level.py +0 -0
  113. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/node.py +0 -0
  114. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/build/project.py +0 -0
  115. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/py.typed +0 -0
  116. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/__init__.py +0 -0
  117. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/array_like.py +0 -0
  118. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/bucket.py +0 -0
  119. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/debug.py +0 -0
  120. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/engine.py +0 -0
  121. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/instruction.py +0 -0
  122. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/__init__.py +0 -0
  123. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/builtin_impls.py +0 -0
  124. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/callbacks.py +0 -0
  125. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/constant.py +0 -0
  126. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/descriptor.py +0 -0
  127. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/dict_impl.py +0 -0
  128. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/error.py +0 -0
  129. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/generic.py +0 -0
  130. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/impl.py +0 -0
  131. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/introspection.py +0 -0
  132. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/math_impls.py +0 -0
  133. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/random.py +0 -0
  134. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/range.py +0 -0
  135. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/simulation_context.py +0 -0
  136. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/transient.py +0 -0
  137. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/tuple_impl.py +0 -0
  138. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/internal/value.py +0 -0
  139. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/interval.py +0 -0
  140. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/level.py +0 -0
  141. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/metadata.py +0 -0
  142. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/num.py +0 -0
  143. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/options.py +0 -0
  144. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/particle.py +0 -0
  145. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/pointer.py +0 -0
  146. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/printing.py +0 -0
  147. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/project.py +0 -0
  148. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/quad.py +0 -0
  149. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/record.py +0 -0
  150. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/runtime.py +0 -0
  151. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/text.py +0 -0
  152. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/timing.py +0 -0
  153. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/transform.py +0 -0
  154. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/ui.py +0 -0
  155. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/values.py +0 -0
  156. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/sonolus/script/vec.py +0 -0
  157. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/__init__.py +0 -0
  158. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/level.py +0 -0
  159. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/__init__.py +0 -0
  160. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/buckets.py +0 -0
  161. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/connector.py +0 -0
  162. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/effect.py +0 -0
  163. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/layer.py +0 -0
  164. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/layout.py +0 -0
  165. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/note.py +0 -0
  166. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/options.py +0 -0
  167. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/particle.py +0 -0
  168. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/skin.py +0 -0
  169. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/stage.py +0 -0
  170. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/streams.py +0 -0
  171. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/lib/ui.py +0 -0
  172. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/__init__.py +0 -0
  173. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/connector.py +0 -0
  174. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/event.py +0 -0
  175. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/input.py +0 -0
  176. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/mode.py +0 -0
  177. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/note.py +0 -0
  178. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/play/stage.py +0 -0
  179. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/__init__.py +0 -0
  180. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/connector.py +0 -0
  181. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/event.py +0 -0
  182. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/layout.py +0 -0
  183. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/mode.py +0 -0
  184. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/note.py +0 -0
  185. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/preview/stage.py +0 -0
  186. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/project.py +0 -0
  187. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/__init__.py +0 -0
  188. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/framework.py +0 -0
  189. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/instructions.py +0 -0
  190. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/intro.py +0 -0
  191. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/mode.py +0 -0
  192. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/navigate.py +0 -0
  193. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/painting.py +0 -0
  194. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/phases.py +0 -0
  195. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/preprocess.py +0 -0
  196. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/tutorial/update.py +0 -0
  197. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/__init__.py +0 -0
  198. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/connector.py +0 -0
  199. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/event.py +0 -0
  200. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/mode.py +0 -0
  201. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/note.py +0 -0
  202. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/stage.py +0 -0
  203. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/test_projects/pydori/watch/update_spawn.py +0 -0
  204. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/__init__.py +0 -0
  205. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/__init__.py +0 -0
  206. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/conftest.py +0 -0
  207. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_cfg +0 -0
  208. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_nodes +0 -0
  209. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_fast_optimized_cfg +0 -0
  210. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_nodes +0 -0
  211. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_should_spawn_standard_optimized_cfg +0 -0
  212. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_cfg +0 -0
  213. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_nodes +0 -0
  214. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_fast_optimized_cfg +0 -0
  215. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_nodes +0 -0
  216. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_spawn_order_standard_optimized_cfg +0 -0
  217. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_cfg +0 -0
  218. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_nodes +0 -0
  219. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_fast_optimized_cfg +0 -0
  220. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_nodes +0 -0
  221. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_parallel_standard_optimized_cfg +0 -0
  222. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_cfg +0 -0
  223. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_nodes +0 -0
  224. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_fast_optimized_cfg +0 -0
  225. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_nodes +0 -0
  226. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_connector_update_sequential_standard_optimized_cfg +0 -0
  227. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_cfg +0 -0
  228. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_fast_nodes +0 -0
  229. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_fast_optimized_cfg +0 -0
  230. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_standard_nodes +0 -0
  231. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_touch_standard_optimized_cfg +0 -0
  232. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_cfg +0 -0
  233. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_nodes +0 -0
  234. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_fast_optimized_cfg +0 -0
  235. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_nodes +0 -0
  236. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_hold_manager_update_parallel_standard_optimized_cfg +0 -0
  237. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_cfg +0 -0
  238. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_fast_nodes +0 -0
  239. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_fast_optimized_cfg +0 -0
  240. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_standard_nodes +0 -0
  241. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_initialize_standard_optimized_cfg +0 -0
  242. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_cfg +0 -0
  243. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_fast_nodes +0 -0
  244. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_fast_optimized_cfg +0 -0
  245. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_standard_nodes +0 -0
  246. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_preprocess_standard_optimized_cfg +0 -0
  247. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_cfg +0 -0
  248. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_fast_nodes +0 -0
  249. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_fast_optimized_cfg +0 -0
  250. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_standard_nodes +0 -0
  251. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_should_spawn_standard_optimized_cfg +0 -0
  252. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_cfg +0 -0
  253. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_fast_nodes +0 -0
  254. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_fast_optimized_cfg +0 -0
  255. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_standard_nodes +0 -0
  256. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_spawn_order_standard_optimized_cfg +0 -0
  257. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_cfg +0 -0
  258. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_fast_nodes +0 -0
  259. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_fast_optimized_cfg +0 -0
  260. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_standard_nodes +0 -0
  261. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_terminate_standard_optimized_cfg +0 -0
  262. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_cfg +0 -0
  263. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_fast_nodes +0 -0
  264. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_fast_optimized_cfg +0 -0
  265. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_standard_nodes +0 -0
  266. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_touch_standard_optimized_cfg +0 -0
  267. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_cfg +0 -0
  268. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_fast_nodes +0 -0
  269. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_fast_optimized_cfg +0 -0
  270. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_standard_nodes +0 -0
  271. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_parallel_standard_optimized_cfg +0 -0
  272. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_cfg +0 -0
  273. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_fast_nodes +0 -0
  274. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_fast_optimized_cfg +0 -0
  275. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_standard_nodes +0 -0
  276. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_note_update_sequential_standard_optimized_cfg +0 -0
  277. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_cfg +0 -0
  278. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_nodes +0 -0
  279. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_fast_optimized_cfg +0 -0
  280. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_nodes +0 -0
  281. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_should_spawn_standard_optimized_cfg +0 -0
  282. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_cfg +0 -0
  283. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_nodes +0 -0
  284. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_fast_optimized_cfg +0 -0
  285. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_nodes +0 -0
  286. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_spawn_order_standard_optimized_cfg +0 -0
  287. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_cfg +0 -0
  288. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_nodes +0 -0
  289. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_fast_optimized_cfg +0 -0
  290. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_nodes +0 -0
  291. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_sim_line_update_parallel_standard_optimized_cfg +0 -0
  292. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_cfg +0 -0
  293. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_fast_nodes +0 -0
  294. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_fast_optimized_cfg +0 -0
  295. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_standard_nodes +0 -0
  296. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_preprocess_standard_optimized_cfg +0 -0
  297. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_cfg +0 -0
  298. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_fast_nodes +0 -0
  299. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_fast_optimized_cfg +0 -0
  300. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_standard_nodes +0 -0
  301. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_should_spawn_standard_optimized_cfg +0 -0
  302. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_cfg +0 -0
  303. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_fast_nodes +0 -0
  304. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_fast_optimized_cfg +0 -0
  305. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_standard_nodes +0 -0
  306. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_spawn_order_standard_optimized_cfg +0 -0
  307. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_cfg +0 -0
  308. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_fast_nodes +0 -0
  309. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_fast_optimized_cfg +0 -0
  310. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_standard_nodes +0 -0
  311. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_touch_standard_optimized_cfg +0 -0
  312. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_cfg +0 -0
  313. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_fast_nodes +0 -0
  314. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_fast_optimized_cfg +0 -0
  315. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_standard_nodes +0 -0
  316. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_parallel_standard_optimized_cfg +0 -0
  317. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_cfg +0 -0
  318. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_fast_nodes +0 -0
  319. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_fast_optimized_cfg +0 -0
  320. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_standard_nodes +0 -0
  321. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_stage_update_sequential_standard_optimized_cfg +0 -0
  322. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_cfg +0 -0
  323. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_nodes +0 -0
  324. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_fast_optimized_cfg +0 -0
  325. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_nodes +0 -0
  326. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_initialize_standard_optimized_cfg +0 -0
  327. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_cfg +0 -0
  328. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_nodes +0 -0
  329. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_fast_optimized_cfg +0 -0
  330. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_nodes +0 -0
  331. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_preprocess_standard_optimized_cfg +0 -0
  332. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_cfg +0 -0
  333. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_nodes +0 -0
  334. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_fast_optimized_cfg +0 -0
  335. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_nodes +0 -0
  336. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_should_spawn_standard_optimized_cfg +0 -0
  337. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_cfg +0 -0
  338. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_nodes +0 -0
  339. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_fast_optimized_cfg +0 -0
  340. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_nodes +0 -0
  341. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_spawn_order_standard_optimized_cfg +0 -0
  342. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_cfg +0 -0
  343. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_nodes +0 -0
  344. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_fast_optimized_cfg +0 -0
  345. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_nodes +0 -0
  346. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_terminate_standard_optimized_cfg +0 -0
  347. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_cfg +0 -0
  348. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_fast_nodes +0 -0
  349. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_fast_optimized_cfg +0 -0
  350. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_standard_nodes +0 -0
  351. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_touch_standard_optimized_cfg +0 -0
  352. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_cfg +0 -0
  353. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_nodes +0 -0
  354. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_fast_optimized_cfg +0 -0
  355. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_nodes +0 -0
  356. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_parallel_standard_optimized_cfg +0 -0
  357. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_cfg +0 -0
  358. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_nodes +0 -0
  359. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_fast_optimized_cfg +0 -0
  360. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_nodes +0 -0
  361. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_play_unscored_note_update_sequential_standard_optimized_cfg +0 -0
  362. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_cfg +0 -0
  363. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_nodes +0 -0
  364. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_fast_optimized_cfg +0 -0
  365. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_nodes +0 -0
  366. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_preprocess_standard_optimized_cfg +0 -0
  367. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_cfg +0 -0
  368. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_nodes +0 -0
  369. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_fast_optimized_cfg +0 -0
  370. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_nodes +0 -0
  371. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_bpm_change_render_standard_optimized_cfg +0 -0
  372. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_cfg +0 -0
  373. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_nodes +0 -0
  374. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_fast_optimized_cfg +0 -0
  375. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_nodes +0 -0
  376. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_hold_connector_render_standard_optimized_cfg +0 -0
  377. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_cfg +0 -0
  378. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_nodes +0 -0
  379. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_fast_optimized_cfg +0 -0
  380. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_nodes +0 -0
  381. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_preprocess_standard_optimized_cfg +0 -0
  382. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_cfg +0 -0
  383. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_fast_nodes +0 -0
  384. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_fast_optimized_cfg +0 -0
  385. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_standard_nodes +0 -0
  386. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_note_render_standard_optimized_cfg +0 -0
  387. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_cfg +0 -0
  388. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_nodes +0 -0
  389. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_fast_optimized_cfg +0 -0
  390. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_nodes +0 -0
  391. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_sim_line_render_standard_optimized_cfg +0 -0
  392. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_cfg +0 -0
  393. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_nodes +0 -0
  394. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_fast_optimized_cfg +0 -0
  395. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_nodes +0 -0
  396. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_preprocess_standard_optimized_cfg +0 -0
  397. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_cfg +0 -0
  398. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_fast_nodes +0 -0
  399. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_fast_optimized_cfg +0 -0
  400. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_standard_nodes +0 -0
  401. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_stage_render_standard_optimized_cfg +0 -0
  402. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_cfg +0 -0
  403. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_nodes +0 -0
  404. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_fast_optimized_cfg +0 -0
  405. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_nodes +0 -0
  406. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_preprocess_standard_optimized_cfg +0 -0
  407. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_cfg +0 -0
  408. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_nodes +0 -0
  409. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_fast_optimized_cfg +0 -0
  410. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_nodes +0 -0
  411. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_timescale_change_render_standard_optimized_cfg +0 -0
  412. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_cfg +0 -0
  413. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_nodes +0 -0
  414. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_fast_optimized_cfg +0 -0
  415. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_nodes +0 -0
  416. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_preprocess_standard_optimized_cfg +0 -0
  417. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_cfg +0 -0
  418. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_nodes +0 -0
  419. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_fast_optimized_cfg +0 -0
  420. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_nodes +0 -0
  421. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_preview_preview_unscored_note_render_standard_optimized_cfg +0 -0
  422. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_cfg +0 -0
  423. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_nodes +0 -0
  424. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_fast_optimized_cfg +0 -0
  425. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_cfg +0 -0
  426. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_nodes +0 -0
  427. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_navigate_standard_optimized_cfg +0 -0
  428. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_cfg +0 -0
  429. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_nodes +0 -0
  430. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_fast_optimized_cfg +0 -0
  431. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_cfg +0 -0
  432. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_nodes +0 -0
  433. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_preprocess_standard_optimized_cfg +0 -0
  434. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_cfg +0 -0
  435. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_nodes +0 -0
  436. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_fast_optimized_cfg +0 -0
  437. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_cfg +0 -0
  438. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_nodes +0 -0
  439. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_tutorial_global_update_standard_optimized_cfg +0 -0
  440. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_cfg +0 -0
  441. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_nodes +0 -0
  442. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_fast_optimized_cfg +0 -0
  443. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_cfg +0 -0
  444. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_nodes +0 -0
  445. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_global_update_spawn_standard_optimized_cfg +0 -0
  446. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_cfg +0 -0
  447. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_fast_nodes +0 -0
  448. {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
  449. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_despawn_time_standard_nodes +0 -0
  450. {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
  451. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_cfg +0 -0
  452. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_fast_nodes +0 -0
  453. {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
  454. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_spawn_time_standard_nodes +0 -0
  455. {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
  456. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_cfg +0 -0
  457. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_fast_nodes +0 -0
  458. {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
  459. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_parallel_standard_nodes +0 -0
  460. {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
  461. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_cfg +0 -0
  462. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_fast_nodes +0 -0
  463. {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
  464. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_connector_update_sequential_standard_nodes +0 -0
  465. {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
  466. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_cfg +0 -0
  467. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_fast_nodes +0 -0
  468. {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
  469. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_despawn_time_standard_nodes +0 -0
  470. {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
  471. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_cfg +0 -0
  472. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_fast_nodes +0 -0
  473. {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
  474. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_spawn_time_standard_nodes +0 -0
  475. {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
  476. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_cfg +0 -0
  477. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_nodes +0 -0
  478. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_fast_optimized_cfg +0 -0
  479. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_nodes +0 -0
  480. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_terminate_standard_optimized_cfg +0 -0
  481. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_cfg +0 -0
  482. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_fast_nodes +0 -0
  483. {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
  484. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_hold_manager_update_parallel_standard_nodes +0 -0
  485. {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
  486. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_cfg +0 -0
  487. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_nodes +0 -0
  488. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_fast_optimized_cfg +0 -0
  489. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_nodes +0 -0
  490. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_despawn_time_standard_optimized_cfg +0 -0
  491. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_cfg +0 -0
  492. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_nodes +0 -0
  493. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_fast_optimized_cfg +0 -0
  494. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_nodes +0 -0
  495. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_preprocess_standard_optimized_cfg +0 -0
  496. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_cfg +0 -0
  497. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_nodes +0 -0
  498. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_fast_optimized_cfg +0 -0
  499. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_nodes +0 -0
  500. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_spawn_time_standard_optimized_cfg +0 -0
  501. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_cfg +0 -0
  502. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_nodes +0 -0
  503. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_fast_optimized_cfg +0 -0
  504. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_nodes +0 -0
  505. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_terminate_standard_optimized_cfg +0 -0
  506. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_cfg +0 -0
  507. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_nodes +0 -0
  508. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_fast_optimized_cfg +0 -0
  509. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_nodes +0 -0
  510. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_note_update_parallel_standard_optimized_cfg +0 -0
  511. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_despawn_time_cfg +0 -0
  512. {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
  513. {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
  514. {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
  515. {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
  516. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_spawn_time_cfg +0 -0
  517. {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
  518. {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
  519. {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
  520. {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
  521. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_scheduled_lane_effect_update_parallel_cfg +0 -0
  522. {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
  523. {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
  524. {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
  525. {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
  526. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_cfg +0 -0
  527. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_fast_nodes +0 -0
  528. {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
  529. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_despawn_time_standard_nodes +0 -0
  530. {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
  531. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_cfg +0 -0
  532. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_fast_nodes +0 -0
  533. {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
  534. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_spawn_time_standard_nodes +0 -0
  535. {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
  536. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_cfg +0 -0
  537. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_fast_nodes +0 -0
  538. {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
  539. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_sim_line_update_parallel_standard_nodes +0 -0
  540. {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
  541. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_cfg +0 -0
  542. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_nodes +0 -0
  543. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_fast_optimized_cfg +0 -0
  544. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_nodes +0 -0
  545. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_despawn_time_standard_optimized_cfg +0 -0
  546. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_cfg +0 -0
  547. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_nodes +0 -0
  548. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_fast_optimized_cfg +0 -0
  549. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_nodes +0 -0
  550. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_preprocess_standard_optimized_cfg +0 -0
  551. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_cfg +0 -0
  552. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_nodes +0 -0
  553. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_fast_optimized_cfg +0 -0
  554. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_nodes +0 -0
  555. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_spawn_time_standard_optimized_cfg +0 -0
  556. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_cfg +0 -0
  557. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_nodes +0 -0
  558. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_fast_optimized_cfg +0 -0
  559. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_nodes +0 -0
  560. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_stage_update_parallel_standard_optimized_cfg +0 -0
  561. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_cfg +0 -0
  562. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_fast_nodes +0 -0
  563. {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
  564. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_despawn_time_standard_nodes +0 -0
  565. {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
  566. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_cfg +0 -0
  567. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_nodes +0 -0
  568. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_fast_optimized_cfg +0 -0
  569. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_nodes +0 -0
  570. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_preprocess_standard_optimized_cfg +0 -0
  571. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_cfg +0 -0
  572. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_fast_nodes +0 -0
  573. {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
  574. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_spawn_time_standard_nodes +0 -0
  575. {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
  576. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_cfg +0 -0
  577. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_nodes +0 -0
  578. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_fast_optimized_cfg +0 -0
  579. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_nodes +0 -0
  580. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_terminate_standard_optimized_cfg +0 -0
  581. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_cfg +0 -0
  582. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_fast_nodes +0 -0
  583. {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
  584. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/data/pydori_watch_watch_unscored_note_update_parallel_standard_nodes +0 -0
  585. {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
  586. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/regressions/test_project.py +0 -0
  587. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/__init__.py +0 -0
  588. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/conftest.py +0 -0
  589. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array.py +0 -0
  590. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array_map.py +0 -0
  591. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_array_set.py +0 -0
  592. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_assert.py +0 -0
  593. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_dict.py +0 -0
  594. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_flow.py +0 -0
  595. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_functions.py +0 -0
  596. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_generator.py +0 -0
  597. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_genexpr.py +0 -0
  598. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_helpers.py +0 -0
  599. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_interval.py +0 -0
  600. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_match.py +0 -0
  601. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_maybe.py +0 -0
  602. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_num.py +0 -0
  603. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_operator.py +0 -0
  604. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_quad.py +0 -0
  605. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_random.py +0 -0
  606. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_range.py +0 -0
  607. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_record.py +0 -0
  608. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_transform.py +0 -0
  609. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_tuple.py +0 -0
  610. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_values.py +0 -0
  611. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_var_array.py +0 -0
  612. {sonolus_py-0.4.1 → sonolus_py-0.4.2}/tests/script/test_vec.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sonolus.py
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: Sonolus engine development in Python
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -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] can also be used to specify the size of
122
- the array:
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
- from sonolus.script.array import Dim
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
- - [pydori](https://github.com/qwewqa/pydori): A Bandori-like engine designed to be an example project for Sonolus.py.
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
- New Project Template: [sonolus.py-template-project](https://github.com/qwewqa/sonolus.py-template-project)
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 more detailed information, see the [Concepts](concepts/index.md) and
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 functions by compiling Python code into Sonolus nodes. As such, it supports a subset of Python including
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 specifically designed for use in Sonolus engines.
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 + a.y
70
+ return Vec2(a.x, a.y)
71
71
  else:
72
- return a * 2
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
- ## Getting Started
245
-
246
- Before making a new Sonolus.py engine, it may be helpful to look at some existing projects to see how they use
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.1"
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, has_yield, scan_writes
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
- if has_yield(node) or isinstance(node, ast.GeneratorExp):
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
- "-o0", "--optimize-minimal", action="store_true", help="Use minimal optimization passes"
169
+ "-O0", "--optimize-minimal", action="store_true", help="Use minimal optimization passes"
170
170
  )
171
171
  optimization_group.add_argument(
172
- "-o1", "--optimize-fast", action="store_true", help="Use fast optimization passes"
172
+ "-O1", "--optimize-fast", action="store_true", help="Use fast optimization passes"
173
173
  )
174
174
  optimization_group.add_argument(
175
- "-o2", "--optimize-standard", action="store_true", help="Use standard optimization passes"
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
- callback_state = CallbackContextState(name)
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` callback, and are read-only in other callbacks.
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 `preprocess` callback
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, except that it is not loaded from a level.
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 `spawn()` method.
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`, `update_sequential`, and `touch`).
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 `update_parallel` for better performance.
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 `update_parallel` for better performance.
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):
@@ -33,7 +33,7 @@ class Box[T](Record):
33
33
  x: T = ...
34
34
  y: T = ...
35
35
  box = Box(x)
36
- box.value = y # Works regardless of whether x is a Num or not
36
+ box.value = y # Works regardless of whether x is a Num, array, or record
37
37
  ```
38
38
  """
39
39
 
@@ -1,4 +1,3 @@
1
- # ruff: noqa: E501
2
1
  import math
3
2
 
4
3
  from sonolus.backend.ops import Op
@@ -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. Use `play` instead.
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. Use `loop` instead.
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 (`preprocess`, `update_sequential`, `touch`).
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 preprocessing.
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, *(Num._accept_(arg) for arg in bound_args.args))
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, which should return a `Maybe[T]`.
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` if it exists or `Nothing` otherwise."""
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 multiple places
18
- in a function, provided that all but one return statement returns the literal `Nothing`.
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
- This type is not intended for other uses, such as being stored in a Record, Array, or Archetype.
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 is present, otherwise `Nothing`.
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 is present, otherwise `Nothing`.
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