sonolus.py 0.1.4__py3-none-any.whl → 0.1.5__py3-none-any.whl

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 (77) hide show
  1. sonolus/backend/finalize.py +18 -10
  2. sonolus/backend/interpret.py +7 -7
  3. sonolus/backend/ir.py +24 -0
  4. sonolus/backend/optimize/__init__.py +0 -0
  5. sonolus/backend/{allocate.py → optimize/allocate.py} +4 -3
  6. sonolus/backend/{constant_evaluation.py → optimize/constant_evaluation.py} +7 -7
  7. sonolus/backend/{coalesce.py → optimize/copy_coalesce.py} +3 -3
  8. sonolus/backend/optimize/dead_code.py +185 -0
  9. sonolus/backend/{dominance.py → optimize/dominance.py} +2 -17
  10. sonolus/backend/{flow.py → optimize/flow.py} +6 -5
  11. sonolus/backend/{inlining.py → optimize/inlining.py} +4 -17
  12. sonolus/backend/{liveness.py → optimize/liveness.py} +69 -65
  13. sonolus/backend/optimize/optimize.py +44 -0
  14. sonolus/backend/{passes.py → optimize/passes.py} +1 -1
  15. sonolus/backend/optimize/simplify.py +191 -0
  16. sonolus/backend/{ssa.py → optimize/ssa.py} +31 -18
  17. sonolus/backend/place.py +17 -25
  18. sonolus/backend/utils.py +10 -0
  19. sonolus/backend/visitor.py +360 -101
  20. sonolus/build/compile.py +8 -8
  21. sonolus/build/engine.py +10 -5
  22. sonolus/script/archetype.py +419 -137
  23. sonolus/script/array.py +25 -8
  24. sonolus/script/array_like.py +297 -0
  25. sonolus/script/bucket.py +73 -11
  26. sonolus/script/containers.py +234 -51
  27. sonolus/script/debug.py +8 -8
  28. sonolus/script/easing.py +147 -105
  29. sonolus/script/effect.py +60 -0
  30. sonolus/script/engine.py +71 -4
  31. sonolus/script/globals.py +66 -32
  32. sonolus/script/instruction.py +79 -25
  33. sonolus/script/internal/builtin_impls.py +138 -27
  34. sonolus/script/internal/constant.py +139 -0
  35. sonolus/script/internal/context.py +14 -5
  36. sonolus/script/internal/dict_impl.py +65 -0
  37. sonolus/script/internal/generic.py +6 -9
  38. sonolus/script/internal/impl.py +38 -13
  39. sonolus/script/internal/introspection.py +5 -2
  40. sonolus/script/{math.py → internal/math_impls.py} +28 -28
  41. sonolus/script/internal/native.py +3 -3
  42. sonolus/script/internal/random.py +67 -0
  43. sonolus/script/internal/range.py +81 -0
  44. sonolus/script/internal/transient.py +51 -0
  45. sonolus/script/internal/tuple_impl.py +113 -0
  46. sonolus/script/interval.py +234 -16
  47. sonolus/script/iterator.py +120 -167
  48. sonolus/script/level.py +24 -0
  49. sonolus/script/num.py +79 -47
  50. sonolus/script/options.py +78 -12
  51. sonolus/script/particle.py +37 -4
  52. sonolus/script/pointer.py +4 -4
  53. sonolus/script/print.py +22 -1
  54. sonolus/script/project.py +8 -0
  55. sonolus/script/{graphics.py → quad.py} +75 -12
  56. sonolus/script/record.py +44 -13
  57. sonolus/script/runtime.py +50 -1
  58. sonolus/script/sprite.py +197 -112
  59. sonolus/script/text.py +2 -0
  60. sonolus/script/timing.py +72 -0
  61. sonolus/script/transform.py +296 -66
  62. sonolus/script/ui.py +134 -78
  63. sonolus/script/values.py +6 -13
  64. sonolus/script/vec.py +118 -3
  65. {sonolus_py-0.1.4.dist-info → sonolus_py-0.1.5.dist-info}/METADATA +1 -1
  66. sonolus_py-0.1.5.dist-info/RECORD +89 -0
  67. sonolus/backend/dead_code.py +0 -80
  68. sonolus/backend/optimize.py +0 -37
  69. sonolus/backend/simplify.py +0 -47
  70. sonolus/script/comptime.py +0 -160
  71. sonolus/script/random.py +0 -14
  72. sonolus/script/range.py +0 -58
  73. sonolus_py-0.1.4.dist-info/RECORD +0 -84
  74. /sonolus/script/{callbacks.py → internal/callbacks.py} +0 -0
  75. {sonolus_py-0.1.4.dist-info → sonolus_py-0.1.5.dist-info}/WHEEL +0 -0
  76. {sonolus_py-0.1.4.dist-info → sonolus_py-0.1.5.dist-info}/entry_points.txt +0 -0
  77. {sonolus_py-0.1.4.dist-info → sonolus_py-0.1.5.dist-info}/licenses/LICENSE +0 -0
@@ -1,37 +0,0 @@
1
- from sonolus.backend.allocate import Allocate, AllocateBasic
2
- from sonolus.backend.coalesce import CopyCoalesce
3
- from sonolus.backend.constant_evaluation import SparseConditionalConstantPropagation
4
- from sonolus.backend.dead_code import DeadCodeElimination, UnreachableCodeElimination
5
- from sonolus.backend.flow import BasicBlock
6
- from sonolus.backend.inlining import InlineVars
7
- from sonolus.backend.passes import run_passes
8
- from sonolus.backend.simplify import CoalesceFlow
9
- from sonolus.backend.ssa import FromSSA, ToSSA
10
-
11
- MINIMAL_PASSES = [
12
- CoalesceFlow(),
13
- UnreachableCodeElimination(),
14
- AllocateBasic(),
15
- ]
16
-
17
- STANDARD_PASSES = [
18
- CoalesceFlow(),
19
- UnreachableCodeElimination(),
20
- DeadCodeElimination(),
21
- ToSSA(),
22
- SparseConditionalConstantPropagation(),
23
- UnreachableCodeElimination(),
24
- DeadCodeElimination(),
25
- CoalesceFlow(),
26
- InlineVars(),
27
- FromSSA(),
28
- CoalesceFlow(),
29
- CopyCoalesce(),
30
- DeadCodeElimination(),
31
- CoalesceFlow(),
32
- Allocate(),
33
- ]
34
-
35
-
36
- def optimize_and_allocate(cfg: BasicBlock):
37
- return run_passes(cfg, STANDARD_PASSES)
@@ -1,47 +0,0 @@
1
- from sonolus.backend.flow import BasicBlock
2
- from sonolus.backend.ir import IRGet, IRSet
3
- from sonolus.backend.passes import CompilerPass
4
-
5
-
6
- class CoalesceFlow(CompilerPass):
7
- def run(self, entry: BasicBlock) -> BasicBlock:
8
- queue = [entry]
9
- processed = set()
10
- while queue:
11
- block = queue.pop()
12
- if block in processed:
13
- continue
14
- processed.add(block)
15
- if len(block.outgoing) != 1:
16
- queue.extend(edge.dst for edge in block.outgoing)
17
- continue
18
- next_block = next(iter(block.outgoing)).dst
19
- if len(next_block.incoming) != 1:
20
- queue.append(next_block)
21
- if not block.statements and not block.phis and not next_block.phis:
22
- for edge in block.incoming:
23
- edge.dst = next_block
24
- next_block.incoming.add(edge)
25
- for edge in block.outgoing: # There should be exactly one
26
- next_block.incoming.remove(edge)
27
- if block is entry:
28
- entry = next_block
29
- continue
30
- for p, args in next_block.phis.items():
31
- if block not in args:
32
- continue
33
- block.statements.append(IRSet(p, IRGet(args[block])))
34
- block.statements.extend(next_block.statements)
35
- block.test = next_block.test
36
- block.outgoing = next_block.outgoing
37
- for edge in block.outgoing:
38
- edge.src = block
39
- dst = edge.dst
40
- for args in dst.phis.values():
41
- if next_block in args:
42
- args[block] = args.pop(next_block)
43
- processed.add(next_block)
44
- queue.extend(edge.dst for edge in block.outgoing)
45
- processed.remove(block)
46
- queue.append(block)
47
- return entry
@@ -1,160 +0,0 @@
1
- from collections.abc import Iterable
2
- from typing import TYPE_CHECKING, Any, Self, TypeVar, final
3
-
4
- from sonolus.backend.place import BlockPlace
5
- from sonolus.script.internal.generic import GenericValue
6
- from sonolus.script.internal.impl import meta_fn, validate_value
7
-
8
-
9
- @final
10
- class _Comptime[T, V](GenericValue):
11
- _instance: Self | None = None
12
-
13
- def __init__(self):
14
- super().__init__()
15
- raise TypeError("Comptime cannot be instantiated")
16
-
17
- @classmethod
18
- def value(cls):
19
- _, value = cls._type_args_
20
- if isinstance(value, Identity):
21
- return value.value
22
- return value
23
-
24
- @classmethod
25
- def _get_parameterized(cls, args: tuple[Any, ...]) -> type[Self]:
26
- result = super()._get_parameterized(args)
27
- result._instance = object.__new__(result)
28
- return result
29
-
30
- @classmethod
31
- def _size_(cls) -> int:
32
- return 0
33
-
34
- @classmethod
35
- def _is_value_type_(cls) -> bool:
36
- return False
37
-
38
- @classmethod
39
- def _from_place_(cls, place: BlockPlace) -> Self:
40
- return cls._instance
41
-
42
- @classmethod
43
- def _accepts_(cls, value: Any) -> bool:
44
- from sonolus.script.internal.impl import validate_value
45
-
46
- value = validate_value(value)
47
- if not value._is_py_():
48
- return False
49
- if cls._type_args_ is None:
50
- return True
51
- return value._as_py_() == cls.value()
52
-
53
- @classmethod
54
- def _accept_(cls, value: Any) -> Self:
55
- from sonolus.script.internal.impl import validate_value
56
-
57
- if not cls._accepts_(value):
58
- raise TypeError("Value does not match this Comptime instance")
59
- # This might not actually return a Comptime instance, but it will be a compile-time constant
60
- return validate_value(value)
61
-
62
- def _is_py_(self) -> bool:
63
- return True
64
-
65
- def _as_py_(self) -> Any:
66
- return self.value()
67
-
68
- @classmethod
69
- def _from_list_(cls, values: Iterable[float | BlockPlace]) -> Self:
70
- return cls._instance
71
-
72
- def _to_list_(self, level_refs: dict[Any, int] | None = None) -> list[float | BlockPlace]:
73
- return []
74
-
75
- @classmethod
76
- def _flat_keys_(cls, prefix: str) -> list[str]:
77
- return []
78
-
79
- def _get_(self) -> Self:
80
- from sonolus.script.internal.impl import validate_value
81
-
82
- # Converts numbers out of comptime, although _accept_ may end up returning a non-comptime instance anyway
83
- return validate_value(self.value())
84
-
85
- def _set_(self, value: Self):
86
- if value is not self:
87
- raise TypeError("Comptime value cannot be changed")
88
-
89
- def _copy_from_(self, value: Self):
90
- if value is not self:
91
- raise TypeError("Comptime value cannot be changed")
92
-
93
- def _copy_(self) -> Self:
94
- return self
95
-
96
- @meta_fn
97
- def __eq__(self, other):
98
- other = validate_value(other)
99
- match self.value():
100
- case str():
101
- return other._is_py_() and other._as_py_() == self.value()
102
- case _:
103
- raise TypeError("Unsupported comparison with comptime value")
104
-
105
- @meta_fn
106
- def __hash__(self):
107
- return hash(self.value())
108
-
109
- @classmethod
110
- def _alloc_(cls) -> Self:
111
- return cls._instance
112
-
113
- @classmethod
114
- def _validate__type_args_(cls, args: tuple[Any, ...]) -> tuple[Any, ...]:
115
- if len(args) == 2:
116
- _, value = args
117
- # We want the type to be there for documentation,
118
- # but not enforced since they might not match up, e.g. a Callable is really FunctionType
119
- if isinstance(value, TypeVar):
120
- args = Any, value
121
- else:
122
- args = type(value), value
123
- return super()._validate__type_args_(args)
124
-
125
- @classmethod
126
- def accept_unchecked(cls, value: Any) -> Self:
127
- if isinstance(value, dict | tuple):
128
- args = type(value), Identity(value)
129
- else:
130
- args = type(value), value
131
- if args not in cls._parameterized_:
132
- cls._parameterized_[args] = cls._get_parameterized(args)
133
- return cls._parameterized_[args]._instance
134
-
135
-
136
- class Identity[T]: # This is to allow accepting potentially unhashable values by using identity comparison
137
- value: T
138
-
139
- def __init__(self, value: T):
140
- self.value = value
141
-
142
- def __eq__(self, other):
143
- return self is other
144
-
145
- def __hash__(self):
146
- return id(self)
147
-
148
- def __str__(self):
149
- return f"{type(self).__name__}({self.value})"
150
-
151
- def __repr__(self):
152
- return f"{type(self).__name__}({self.value!r})"
153
-
154
-
155
- if TYPE_CHECKING:
156
- type Comptime[T, V] = T | V
157
- else:
158
- _Comptime.__name__ = "Comptime"
159
- _Comptime.__qualname__ = "Comptime"
160
- globals()["Comptime"] = _Comptime
sonolus/script/random.py DELETED
@@ -1,14 +0,0 @@
1
- import random as _random
2
-
3
- from sonolus.backend.ops import Op
4
- from sonolus.script.internal.native import native_function
5
-
6
-
7
- @native_function(Op.Random)
8
- def random_float(lo: float = 0.0, hi: float = 1.0, /) -> float:
9
- return lo + (hi - lo) * _random.random()
10
-
11
-
12
- @native_function(Op.RandomInteger)
13
- def random_integer(lo: int, hi: int, /) -> int:
14
- return _random.randint(lo, hi)
sonolus/script/range.py DELETED
@@ -1,58 +0,0 @@
1
- from sonolus.script.iterator import ArrayLike, SonolusIterator
2
- from sonolus.script.num import Num
3
- from sonolus.script.record import Record
4
-
5
-
6
- class Range(Record, ArrayLike[Num]):
7
- start: int
8
- end: int
9
- step: int
10
-
11
- def __new__(cls, start: Num, end: Num | None = None, step: Num = 1):
12
- if end is None:
13
- start, end = 0, start
14
- return super().__new__(cls, start, end, step)
15
-
16
- def __iter__(self) -> SonolusIterator:
17
- return RangeIterator(self.start, self.end, self.step)
18
-
19
- def __contains__(self, item):
20
- if self.step > 0:
21
- return self.start <= item < self.end and (item - self.start) % self.step == 0
22
- else:
23
- return self.end < item <= self.start and (self.start - item) % -self.step == 0
24
-
25
- def size(self) -> int:
26
- if self.step > 0:
27
- diff = self.end - self.start
28
- if diff <= 0:
29
- return 0
30
- return (diff + self.step - 1) // self.step
31
- else:
32
- diff = self.start - self.end
33
- if diff <= 0:
34
- return 0
35
- return (diff - self.step - 1) // -self.step
36
-
37
- def __getitem__(self, index: Num) -> Num:
38
- return self.start + index * self.step
39
-
40
- def __setitem__(self, index: Num, value: Num):
41
- raise TypeError("Range does not support item assignment")
42
-
43
-
44
- class RangeIterator(Record, SonolusIterator):
45
- value: int
46
- end: int
47
- step: int
48
-
49
- def has_next(self) -> bool:
50
- if self.step > 0:
51
- return self.value < self.end
52
- else:
53
- return self.value > self.end
54
-
55
- def next(self) -> Num:
56
- value = self.value
57
- self.value += self.step
58
- return value
@@ -1,84 +0,0 @@
1
- sonolus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- sonolus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- sonolus/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- sonolus/backend/allocate.py,sha256=9Ua4dW_GDzqaSimSbqwjJ4zVXS1M2bJhgHQ2H564eio,5536
5
- sonolus/backend/blocks.py,sha256=3peyb9eYBy0s53xNVJ1KmK4IgoyVkkwG-lqDQ_VZTHc,18531
6
- sonolus/backend/coalesce.py,sha256=ZKSGZrG5V4ShcjGJEhkFoMmJ1f9cEhySgXQkC9sibGQ,3939
7
- sonolus/backend/constant_evaluation.py,sha256=5euKXPBlVZ5f17YaksUWC0vdDnJ_qQk2l8Wg8NFD1_4,15931
8
- sonolus/backend/dead_code.py,sha256=iy8Cvc1OK4Dh68oJ6QdYqJRsTqPby08GDwu2fB_1JKs,3562
9
- sonolus/backend/dominance.py,sha256=Ku0Zh8bW3ZvMVKcLdRWI-LSstgSB2s-iIdj34mD_HrA,3658
10
- sonolus/backend/excepthook.py,sha256=pqI9gtPBh0mlTgMNqul8bEVO1ARzKb8pNE9EN_CyDpk,994
11
- sonolus/backend/finalize.py,sha256=vDNUZ0KV3Z_q9sDSltxDoQqKoOf68l6LoM9jWUHpq8g,3330
12
- sonolus/backend/flow.py,sha256=YlIu-iTVg8saZqobvsDP2dH_z1zBvTXiUCWsCMoGBbg,4222
13
- sonolus/backend/inlining.py,sha256=xyV5LkkXn4BI4FyAI2UMdQdUXjIN4aKAS37W0pjawGE,6129
14
- sonolus/backend/interpret.py,sha256=EDpkv3ASzteDhYjTkzoriGYHYepcoHKZusrU_FX0DS4,14247
15
- sonolus/backend/ir.py,sha256=CzrSSFuA3zvw24BapGSTzBhUT83oETscODlrUWnyHWs,2087
16
- sonolus/backend/liveness.py,sha256=PxbmPXsps3XpIdUp-bMFZLVRlaDEZLZt5T6v3_GVftQ,7095
17
- sonolus/backend/mode.py,sha256=NkcPZJm8dn83LX35uP24MtQOCnfRDFZ280dHeEEfauE,613
18
- sonolus/backend/node.py,sha256=H8qgnNyIseR-DhfgtcbDX03SUmhAJSSrYAlUEJTkkUo,999
19
- sonolus/backend/ops.py,sha256=ekkHSdgRubIYLSYFk0wTUuBvyf3TKdApM4AyR_koTQ8,10122
20
- sonolus/backend/optimize.py,sha256=1_P1MJx3GVJYlK7vheFtQWOvZFPsC2x0xFuXLQmnfwE,1082
21
- sonolus/backend/passes.py,sha256=RWsDJnyVEBzzOppaC3JCg62SuuPoRbKF_Tik3Z75M0s,1634
22
- sonolus/backend/place.py,sha256=61mWyPQ6i59bmV9RtQfUy6mJE0pMAmFoL1W-MyY79ug,2536
23
- sonolus/backend/simplify.py,sha256=nFhHzEfzz7lZM5Thx5vaC4L7ahm8yQZmrN2hN5N5TKQ,1950
24
- sonolus/backend/ssa.py,sha256=LPTmX7tJuuZ98CVf6M5YEqKEM9VxzM7qy-H4cYvD4M0,8116
25
- sonolus/backend/utils.py,sha256=1C4xvxHrQ94RAWS3d4CprmUnFeqgEOzpZjJRooHVpS0,1382
26
- sonolus/backend/visitor.py,sha256=RgkbYa5NP4dQbgerlpfD8qwkJPkHYaH9rFDB6NREp5Y,35855
27
- sonolus/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- sonolus/build/cli.py,sha256=YlWg3Jfe1gi2wnlIJDh8LCMLSPV3l9AiuDWk2Bbphmg,5812
29
- sonolus/build/collection.py,sha256=IsDgedsAJ-foHzQ4LnQ9zSVXSz5wVVt4sgqiUICBvCU,10573
30
- sonolus/build/compile.py,sha256=mEtaWu7kFGYhAYZv28OGfflJ6oIkt0oVLJ9Va8R3atE,3547
31
- sonolus/build/engine.py,sha256=C0xKUikTKETg2SaPGQpcq4MBhPK-JAkbD1dTPvT47Y0,6732
32
- sonolus/build/level.py,sha256=3sdGPvIZ4a15u3-JdITnB6rznp6a2E3k6A0gB8A15JA,610
33
- sonolus/build/node.py,sha256=jwsVWt6Brh4M9MypUt3Nqnxfm7fXrCMRWYQGwBTAszI,1162
34
- sonolus/build/project.py,sha256=x350tPcwKCYakdbrP796b545hVUaBwrzY0yEcQR7ut4,4023
35
- sonolus/script/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- sonolus/script/archetype.py,sha256=SnhVgoYEnpm3CVujaIWmCVsUG5BnqNhn5iI5h9C44jk,25542
37
- sonolus/script/array.py,sha256=iqxLGq_52z9pn5NKChJZp_I4YCcTNWGcIWHQW7dScWo,8966
38
- sonolus/script/bucket.py,sha256=7aOHsun-xvkwA9PTl0h9Bj3vXAgQauo5cjg2WkE3zNM,5356
39
- sonolus/script/callbacks.py,sha256=vWzJG8uiJoEtsNnbeZPqOHogCwoLpz2D1MnHY2wVV8s,2801
40
- sonolus/script/comptime.py,sha256=cMf1VsTU59Nw4fhuW1NkTi11qMRirTg5bsfpI_Bn09Q,4734
41
- sonolus/script/containers.py,sha256=MPZNh7atddkrQ_Y3cky2q1psIvQJUoglf9kHpz_DYGU,7765
42
- sonolus/script/debug.py,sha256=Y7TWr2-uctZEVmVvYzfTi32mIitgTcYKFhCTfBj1-88,2421
43
- sonolus/script/easing.py,sha256=ziYd6zDsMBoVAhoN3vhaI60ywRt5pJU4dfuc-BbZt48,7519
44
- sonolus/script/effect.py,sha256=Px9vhTh_0cZ4h9-R12eOXdKhYyiEvYCVwqGQ2Jh8_CQ,4015
45
- sonolus/script/engine.py,sha256=7BHzBJFYPxJYOIvR9k6X8FV1oQAGcLNBzqaz3O6v_8Y,4758
46
- sonolus/script/globals.py,sha256=W6mWmDbzWhZWuxFr8bmOhlZDCiWoJmYD1QOHBmZCX9o,8397
47
- sonolus/script/graphics.py,sha256=1yk1d-d0YAQiq7GhVOtFFEo0DgGLvRXuJcNvz8SwG-4,5083
48
- sonolus/script/instruction.py,sha256=WgUWtJwyzYRnYE7ykxQWVH0XVN_a63L7po4LG4vGedA,5398
49
- sonolus/script/interval.py,sha256=exQb8guUbtTyDCuFytD3PQiEXGhDN9yoP9HiYL1H6iM,3266
50
- sonolus/script/iterator.py,sha256=0_CRITyqR5IzpEFXpuPQlvAAOrDRNA4hmv4iFFHR20E,5299
51
- sonolus/script/level.py,sha256=lcC6zHg3kp8Vm-pG96zASVPG16JeOp3ZR907snXdy18,1249
52
- sonolus/script/math.py,sha256=s46jpHe2vrl9f6Zm7qI6cYR8NrwsypYfQLEihDGNx8E,2278
53
- sonolus/script/num.py,sha256=ZJF1_H1y6bddmaVuU_-gSOFiFgpdcUjfoOU86GVBFgc,12491
54
- sonolus/script/options.py,sha256=uufzFHft59FgdF1HTcv9FM3l0ZIjb8wCyhW9mESk_ZQ,5511
55
- sonolus/script/particle.py,sha256=vjtI3EwSCjKM41nBmf6Qt3KtaXbHgIwBnn3RCNtDPHs,7387
56
- sonolus/script/pointer.py,sha256=c_NoOHU8_PgglVAd6m3RkAO_JCdoD8wP_bZiE2OYFRc,1115
57
- sonolus/script/print.py,sha256=vDgE42yw9f5kXFk-A4ppQgwgKNIjiUXS7GVIHZdhdmg,1564
58
- sonolus/script/project.py,sha256=7K3iwUdSXAQyEAwcZvtfxgv3M0IaUaXSroUBEj4dnuA,416
59
- sonolus/script/random.py,sha256=Mgo-fSnWRgOIowdQnPRtbUUdMmUB21tKnwe2d3sjggk,379
60
- sonolus/script/range.py,sha256=D1nr_CvrfCwopiP2XVVVHQW3eDnDfLsQ7VKe-rEf1Tg,1695
61
- sonolus/script/record.py,sha256=y06I56PcYJAxjNJiauuhV33mGiH3Z9Lz603_9N03PxE,10472
62
- sonolus/script/runtime.py,sha256=vciRWn_WG9jyCU236cDXzwuigOtqzswKIJjAZxt1ob4,17100
63
- sonolus/script/sprite.py,sha256=vNl67okRBOFi3IoXVGOHPt8k9TJQqb9EscxwHnWqlrE,12989
64
- sonolus/script/text.py,sha256=UPXw8xyGW0sSJR8uiZyDIVF5MtNV9MbyI-AfYZPqHro,12989
65
- sonolus/script/timing.py,sha256=utAry65nkeDKBT-r_AYz-mWkgylBhiUUMordA3pDhLk,1028
66
- sonolus/script/transform.py,sha256=ROPm1HjJnP--Jhw2ziHQHns0kyF6b6m2P949Ispp9Mc,5650
67
- sonolus/script/ui.py,sha256=F-yFndriiqWRHaAOQ7WtnjPIHHQuhAYHMwtFaZM6OJ4,4488
68
- sonolus/script/values.py,sha256=TyRxHjuvtXlQpKGyVRg0T8fJgXMboKY4TZxQ3lFR4bs,1261
69
- sonolus/script/vec.py,sha256=tucqiZGFlUEwZQSGKmuacwfP2FiH-94C-crvr7Dt51w,2122
70
- sonolus/script/internal/__init__.py,sha256=T6rzLoiOUaiSQtaHMZ88SNO-ijSjSSv33TKtUwu-Ms8,136
71
- sonolus/script/internal/builtin_impls.py,sha256=qo1ZIgZ_FQl6O6CftuDqxuANObv3vzD7KT3bM30SbvU,4012
72
- sonolus/script/internal/context.py,sha256=lN1Lmh5sB7GTjX10V2vUhGgCBfUsVoDHzweUY3VCd_s,13060
73
- sonolus/script/internal/descriptor.py,sha256=XRFey-EjiAm_--KsNl-8N0Mi_iyQwlPh68gDp0pKf3E,392
74
- sonolus/script/internal/error.py,sha256=ZNnsvQVQAnFKzcvsm6-sste2lo-tP5pPI8sD7XlAZWc,490
75
- sonolus/script/internal/generic.py,sha256=-rhFatYZLrDE3RFgDWu_Zto3funHXmMr3QuyxajaWKU,7356
76
- sonolus/script/internal/impl.py,sha256=tnIaQCmw0SlFpmnSJp2aEys9XVxoj0Vi8Yf6SP-oUAQ,2321
77
- sonolus/script/internal/introspection.py,sha256=KBhs_cQxfQpXyFusz3R6O1YkA6ahQni8A2_h5W2A-c0,544
78
- sonolus/script/internal/native.py,sha256=YKx4uX6Y1cJaoLWpS8oQbWzHMZA5SSCE2cfeyv-nQkY,1518
79
- sonolus/script/internal/value.py,sha256=ik9sMKl0TbsH_C6QNxD4WfpAnmBFISgmmlazWwh3kY0,4308
80
- sonolus_py-0.1.4.dist-info/METADATA,sha256=QciwdolhqTIFmhm7mxBs5MBZzFuoEdIBZgijIQawbUQ,216
81
- sonolus_py-0.1.4.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
82
- sonolus_py-0.1.4.dist-info/entry_points.txt,sha256=oTYspY_b7SA8TptEMTDxh4-Aj-ZVPnYC9f1lqH6s9G4,54
83
- sonolus_py-0.1.4.dist-info/licenses/LICENSE,sha256=JEKpqVhQYfEc7zg3Mj462sKbKYmO1K7WmvX1qvg9IJk,1067
84
- sonolus_py-0.1.4.dist-info/RECORD,,
File without changes