@typeonce/ritmo 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +3 -2
  2. package/dist/Clock.d.ts +19 -4
  3. package/dist/Clock.d.ts.map +1 -1
  4. package/dist/Clock.js +18 -2
  5. package/dist/Clock.js.map +1 -1
  6. package/dist/Command.d.ts +181 -40
  7. package/dist/Command.d.ts.map +1 -1
  8. package/dist/Command.js +31 -11
  9. package/dist/Command.js.map +1 -1
  10. package/dist/Condition.d.ts +12 -1
  11. package/dist/Condition.d.ts.map +1 -1
  12. package/dist/Condition.js.map +1 -1
  13. package/dist/Debug.d.ts +127 -13
  14. package/dist/Debug.d.ts.map +1 -1
  15. package/dist/Descriptor.d.ts +61 -10
  16. package/dist/Descriptor.d.ts.map +1 -1
  17. package/dist/Descriptor.js +22 -10
  18. package/dist/Descriptor.js.map +1 -1
  19. package/dist/Entity.d.ts +22 -7
  20. package/dist/Entity.d.ts.map +1 -1
  21. package/dist/Entity.js.map +1 -1
  22. package/dist/EntityScope.d.ts +20 -1
  23. package/dist/EntityScope.d.ts.map +1 -1
  24. package/dist/EntityScope.js +8 -2
  25. package/dist/EntityScope.js.map +1 -1
  26. package/dist/FixedLoop.d.ts +106 -0
  27. package/dist/FixedLoop.d.ts.map +1 -0
  28. package/dist/FixedLoop.js +97 -0
  29. package/dist/FixedLoop.js.map +1 -0
  30. package/dist/HostClock.d.ts +1 -1
  31. package/dist/HostClock.d.ts.map +1 -1
  32. package/dist/HostClock.js +2 -1
  33. package/dist/HostClock.js.map +1 -1
  34. package/dist/Machine.d.ts +59 -34
  35. package/dist/Machine.d.ts.map +1 -1
  36. package/dist/Machine.js +10 -3
  37. package/dist/Machine.js.map +1 -1
  38. package/dist/Query.d.ts +100 -14
  39. package/dist/Query.d.ts.map +1 -1
  40. package/dist/Query.js +34 -5
  41. package/dist/Query.js.map +1 -1
  42. package/dist/Relation.d.ts +5 -14
  43. package/dist/Relation.d.ts.map +1 -1
  44. package/dist/Relation.js +0 -32
  45. package/dist/Relation.js.map +1 -1
  46. package/dist/Runtime.d.ts +61 -15
  47. package/dist/Runtime.d.ts.map +1 -1
  48. package/dist/Runtime.js +594 -70
  49. package/dist/Runtime.js.map +1 -1
  50. package/dist/Schedule.d.ts +24 -15
  51. package/dist/Schedule.d.ts.map +1 -1
  52. package/dist/Schedule.js +2 -1
  53. package/dist/Schedule.js.map +1 -1
  54. package/dist/Schema.d.ts +233 -48
  55. package/dist/Schema.d.ts.map +1 -1
  56. package/dist/Schema.js +33 -7
  57. package/dist/Schema.js.map +1 -1
  58. package/dist/Snapshot.d.ts +90 -1
  59. package/dist/Snapshot.d.ts.map +1 -1
  60. package/dist/Snapshot.js +42 -1
  61. package/dist/Snapshot.js.map +1 -1
  62. package/dist/System.d.ts +132 -31
  63. package/dist/System.d.ts.map +1 -1
  64. package/dist/System.js +32 -0
  65. package/dist/System.js.map +1 -1
  66. package/dist/index.d.ts +4 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +4 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/internal/cells.d.ts +2 -0
  71. package/dist/internal/cells.d.ts.map +1 -1
  72. package/dist/internal/cells.js +34 -8
  73. package/dist/internal/cells.js.map +1 -1
  74. package/dist/internal/debug.d.ts +10 -0
  75. package/dist/internal/debug.d.ts.map +1 -1
  76. package/dist/internal/debug.js +171 -12
  77. package/dist/internal/debug.js.map +1 -1
  78. package/dist/internal/equal.d.ts +8 -0
  79. package/dist/internal/equal.d.ts.map +1 -0
  80. package/dist/internal/equal.js +38 -0
  81. package/dist/internal/equal.js.map +1 -0
  82. package/dist/internal/fragments.d.ts +2 -6
  83. package/dist/internal/fragments.d.ts.map +1 -1
  84. package/dist/internal/fragments.js +36 -3
  85. package/dist/internal/fragments.js.map +1 -1
  86. package/dist/internal/game.d.ts +2 -0
  87. package/dist/internal/game.d.ts.map +1 -1
  88. package/dist/internal/game.js +48 -7
  89. package/dist/internal/game.js.map +1 -1
  90. package/dist/internal/order.d.ts.map +1 -1
  91. package/dist/internal/order.js +4 -2
  92. package/dist/internal/order.js.map +1 -1
  93. package/dist/internal/queries.d.ts.map +1 -1
  94. package/dist/internal/queries.js +57 -26
  95. package/dist/internal/queries.js.map +1 -1
  96. package/dist/internal/relations.d.ts +10 -0
  97. package/dist/internal/relations.d.ts.map +1 -0
  98. package/dist/internal/relations.js +32 -0
  99. package/dist/internal/relations.js.map +1 -0
  100. package/dist/internal/requirements.d.ts +26 -0
  101. package/dist/internal/requirements.d.ts.map +1 -0
  102. package/dist/internal/requirements.js +46 -0
  103. package/dist/internal/requirements.js.map +1 -0
  104. package/dist/internal/streams.d.ts +2 -0
  105. package/dist/internal/streams.d.ts.map +1 -1
  106. package/dist/internal/streams.js +10 -0
  107. package/dist/internal/streams.js.map +1 -1
  108. package/dist/internal/world.d.ts +7 -1
  109. package/dist/internal/world.d.ts.map +1 -1
  110. package/dist/internal/world.js +53 -3
  111. package/dist/internal/world.js.map +1 -1
  112. package/package.json +1 -1
  113. package/src/Clock.ts +29 -4
  114. package/src/Command.ts +281 -67
  115. package/src/Condition.ts +17 -1
  116. package/src/Debug.ts +124 -15
  117. package/src/Descriptor.ts +92 -21
  118. package/src/Entity.ts +23 -7
  119. package/src/EntityScope.ts +21 -2
  120. package/src/FixedLoop.ts +218 -0
  121. package/src/HostClock.ts +2 -1
  122. package/src/Machine.ts +72 -35
  123. package/src/Query.ts +118 -17
  124. package/src/Relation.ts +5 -67
  125. package/src/Runtime.ts +659 -85
  126. package/src/Schedule.ts +31 -19
  127. package/src/Schema.ts +297 -57
  128. package/src/Snapshot.ts +94 -2
  129. package/src/System.ts +151 -29
  130. package/src/index.ts +4 -0
  131. package/src/internal/cells.ts +42 -10
  132. package/src/internal/debug.ts +179 -14
  133. package/src/internal/equal.ts +31 -0
  134. package/src/internal/fragments.ts +35 -5
  135. package/src/internal/game.ts +69 -7
  136. package/src/internal/order.ts +8 -4
  137. package/src/internal/queries.ts +62 -12
  138. package/src/internal/relations.ts +52 -0
  139. package/src/internal/requirements.ts +71 -0
  140. package/src/internal/streams.ts +11 -0
  141. package/src/internal/world.ts +60 -4
package/src/Schedule.ts CHANGED
@@ -147,10 +147,12 @@ export type CompositionOrder<Entries extends ReadonlyArray<unknown>> = ScheduleO
147
147
  // walks back from the reader to the nearest marker, which is usually close.
148
148
 
149
149
  /** An event or resource read. */
150
- interface DataRead<Kind, Key, Reader> {
150
+ interface DataRead<Kind, Key, Reader, ReaderSystem> {
151
151
  readonly kind: Kind
152
152
  readonly key: Key
153
153
  readonly reader: Reader
154
+ /** The reader itself: systems may share a display name, so writers are told apart by type. */
155
+ readonly readerSystem: ReaderSystem
154
156
  }
155
157
 
156
158
  /**
@@ -158,19 +160,24 @@ interface DataRead<Kind, Key, Reader> {
158
160
  * component it names (`Named`: selection slots, optional ones included,
159
161
  * `with`, `without`, and filters).
160
162
  */
161
- interface QueryRead<Slot, Required, Named, Reader> {
163
+ interface QueryRead<Slot, Required, Named, Reader, ReaderSystem> {
162
164
  readonly kind: "query"
163
165
  readonly slot: Slot
164
166
  readonly required: Required
165
167
  readonly named: Named
166
168
  readonly reader: Reader
169
+ readonly readerSystem: ReaderSystem
167
170
  }
168
171
 
169
172
  type DescriptorKind<D> = D extends { readonly kind: infer Kind } ? Kind : never
170
173
 
171
174
  type Names<D> = D extends { readonly name: infer Name extends string } ? Name : never
172
175
 
173
- type DescriptorsOf<Access> = Access extends { readonly descriptor: infer D } ? D : never
176
+ type DescriptorsOf<Access> =
177
+ Access extends { readonly descriptor: infer D } ? D
178
+ // A Query.anyOf filter names the components of its member filters.
179
+ : Access extends { readonly kind: "anyOf"; readonly filters: ReadonlyArray<infer Member> } ? DescriptorsOf<Member>
180
+ : never
174
181
 
175
182
  /** Every system an entry runs, nested schedules and transition bundles included, as a union. */
176
183
  type SystemsIn<Entry> =
@@ -179,13 +186,14 @@ type SystemsIn<Entry> =
179
186
  ? [Order] extends [never] ? never : SystemsIn<Order["entries"][number]>
180
187
  : never
181
188
 
182
- type QueryReadOf<Slot, Q, Reader> =
189
+ type QueryReadOf<Slot, Q, Reader, ReaderSystem> =
183
190
  Q extends { readonly selection: infer Selection; readonly with: infer With extends ReadonlyArray<unknown>; readonly without: infer Without extends ReadonlyArray<unknown>; readonly filters: infer Filters extends ReadonlyArray<unknown> }
184
191
  ? QueryRead<
185
192
  Slot,
186
193
  Names<{ readonly [K in keyof Selection]: Selection[K] extends { readonly mode: "read" | "write"; readonly descriptor: infer D } ? D : never }[keyof Selection] | With[number]>,
187
194
  Names<DescriptorsOf<Selection[keyof Selection]> | With[number] | Without[number] | DescriptorsOf<Filters[number]>>,
188
- Reader
195
+ Reader,
196
+ ReaderSystem
189
197
  >
190
198
  : never
191
199
 
@@ -195,19 +203,22 @@ type SystemReads<Sys> =
195
203
  :
196
204
  | (Extract<SpecAccessValues<Sys["spec"]>, ThisTick> extends infer Access
197
205
  ? Access extends { readonly descriptor: infer D extends { readonly name: string } }
198
- ? DataRead<DescriptorKind<D>, D["name"], Sys["name"]>
206
+ ? DataRead<DescriptorKind<D>, D["name"], Sys["name"], Sys>
199
207
  : never
200
208
  : never)
201
209
  | (Sys["spec"] extends { readonly queries: infer Queries }
202
- ? { readonly [K in keyof Queries]: Queries[K] extends ThisTick ? QueryReadOf<K, Queries[K], Sys["name"]> : never }[keyof Queries]
210
+ ? { readonly [K in keyof Queries]: Queries[K] extends ThisTick ? QueryReadOf<K, Queries[K], Sys["name"], Sys> : never }[keyof Queries]
203
211
  : never)
204
212
  : never
205
213
 
206
- /** Names of the systems among `Systems` that write `Key` (other than `Reader`). */
207
- type WritersOf<Systems, Kind, Key, Reader> =
214
+ /** Whether two system types are the same system (mutually assignable): a shared display name is not enough. */
215
+ type SameSystem<A, B> = [A] extends [B] ? [B] extends [A] ? true : false : false
216
+
217
+ /** Names of the systems among `Systems` that write `Key` (other than the reader itself). */
218
+ type WritersOf<Systems, Kind, Key, ReaderSystem> =
208
219
  Systems extends AnySystem
209
220
  ? IsErased<Systems["spec"]> extends true ? never
210
- : Systems["name"] extends Reader ? never
221
+ : SameSystem<Systems, ReaderSystem> extends true ? never
211
222
  : [Extract<SpecAccessValues<Systems["spec"]>, { readonly mode: "write"; readonly descriptor: { readonly kind: Kind; readonly name: Key } }>] extends [never]
212
223
  ? never
213
224
  : Systems["name"]
@@ -233,18 +244,18 @@ type CommandNames<Commands> =
233
244
  : readonly [never, never]
234
245
 
235
246
  /** Names of the systems among `Systems` whose commands count for a query read (other than its reader). */
236
- type CommandWritersOf<Systems, Required, Named, Reader> =
247
+ type CommandWritersOf<Systems, Required, Named, ReaderSystem> =
237
248
  Systems extends AnySystem
238
249
  ? IsErased<Systems["spec"]> extends true ? never
239
- : Systems["name"] extends Reader ? never
250
+ : SameSystem<Systems, ReaderSystem> extends true ? never
240
251
  : Systems["spec"] extends { readonly commands: infer Commands }
241
252
  ? CommandsCount<Commands, Required, Named> extends true ? Systems["name"] : never
242
253
  : never
243
254
  : never
244
255
 
245
256
  type WritersFor<Systems, R> =
246
- R extends QueryRead<any, infer Required, infer Named, infer Reader> ? CommandWritersOf<Systems, Required, Named, Reader>
247
- : R extends DataRead<infer Kind, infer Key, infer Reader> ? WritersOf<Systems, Kind, Key, Reader>
257
+ R extends QueryRead<any, infer Required, infer Named, any, infer ReaderSystem> ? CommandWritersOf<Systems, Required, Named, ReaderSystem>
258
+ : R extends DataRead<infer Kind, infer Key, any, infer ReaderSystem> ? WritersOf<Systems, Kind, Key, ReaderSystem>
248
259
  : never
249
260
 
250
261
  /**
@@ -288,16 +299,16 @@ type ReaderIndices<Entries extends ReadonlyArray<unknown>, Reader> = {
288
299
 
289
300
  type LateWriterError<R, Writer> =
290
301
  Writer extends string
291
- ? R extends QueryRead<infer Slot extends string, any, any, infer Reader extends string>
302
+ ? R extends QueryRead<infer Slot extends string, any, any, infer Reader extends string, any>
292
303
  ? `${Writer} queues commands that ${Reader} needs this tick (queries.${Slot}), but it runs after ${Reader}: move ${Writer} before the applyDeferred() that precedes ${Reader}, or read queries.${Slot} without thisTick`
293
- : R extends DataRead<any, infer Key extends string, infer Reader extends string>
304
+ : R extends DataRead<any, infer Key extends string, infer Reader extends string, any>
294
305
  ? `${Reader} needs ${Key} from this tick, but its writer ${Writer} runs after it: move ${Writer} before ${Reader}, or read ${Key} without thisTick`
295
306
  : never
296
307
  : never
297
308
 
298
309
  type UnflushedWriterError<R, Writer> =
299
310
  Writer extends string
300
- ? R extends QueryRead<infer Slot extends string, any, any, infer Reader extends string>
311
+ ? R extends QueryRead<infer Slot extends string, any, any, infer Reader extends string, any>
301
312
  ? `${Reader} needs this tick's commands for queries.${Slot}, but ${Writer} queues them with no applyDeferred() in between: add Game.Schedule.applyDeferred() after ${Writer}`
302
313
  : never
303
314
  : never
@@ -371,7 +382,7 @@ type TailSegment<Entries, Acc = never> =
371
382
  : readonly [Acc, false]
372
383
 
373
384
  type UnflushedWriters<Entries, R, Reader extends string> =
374
- R extends QueryRead<any, any, any, any>
385
+ R extends QueryRead<any, any, any, any, any>
375
386
  ? Segment<Entries, Reader> extends infer Found
376
387
  ? Found extends readonly [infer Systems, any] ? UnflushedWriterError<R, WritersFor<Systems, R>> : never
377
388
  : never
@@ -656,7 +667,8 @@ export const make = <S extends Schema.Any, const Entries extends ReadonlyArray<S
656
667
  *
657
668
  * Conditions gate every system in `entries`, nested schedules included.
658
669
  * Marker steps (`applyDeferred`, `applyStateTransitions`) in the group still
659
- * run. A gated system is the same system as far as the runtime is concerned:
670
+ * run, and so do the transition schedules an `applyStateTransitions(bundle)`
671
+ * in the group runs: gate those systems in their own specs. A gated system is the same system as far as the runtime is concerned:
660
672
  * it shares change detection and event cursors with the original and with
661
673
  * any other gated copy, so using one system in two groups of one schedule is
662
674
  * a duplicate like any other.