@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.
- package/README.md +3 -2
- package/dist/Clock.d.ts +19 -4
- package/dist/Clock.d.ts.map +1 -1
- package/dist/Clock.js +18 -2
- package/dist/Clock.js.map +1 -1
- package/dist/Command.d.ts +181 -40
- package/dist/Command.d.ts.map +1 -1
- package/dist/Command.js +31 -11
- package/dist/Command.js.map +1 -1
- package/dist/Condition.d.ts +12 -1
- package/dist/Condition.d.ts.map +1 -1
- package/dist/Condition.js.map +1 -1
- package/dist/Debug.d.ts +127 -13
- package/dist/Debug.d.ts.map +1 -1
- package/dist/Descriptor.d.ts +61 -10
- package/dist/Descriptor.d.ts.map +1 -1
- package/dist/Descriptor.js +22 -10
- package/dist/Descriptor.js.map +1 -1
- package/dist/Entity.d.ts +22 -7
- package/dist/Entity.d.ts.map +1 -1
- package/dist/Entity.js.map +1 -1
- package/dist/EntityScope.d.ts +20 -1
- package/dist/EntityScope.d.ts.map +1 -1
- package/dist/EntityScope.js +8 -2
- package/dist/EntityScope.js.map +1 -1
- package/dist/FixedLoop.d.ts +106 -0
- package/dist/FixedLoop.d.ts.map +1 -0
- package/dist/FixedLoop.js +97 -0
- package/dist/FixedLoop.js.map +1 -0
- package/dist/HostClock.d.ts +1 -1
- package/dist/HostClock.d.ts.map +1 -1
- package/dist/HostClock.js +2 -1
- package/dist/HostClock.js.map +1 -1
- package/dist/Machine.d.ts +59 -34
- package/dist/Machine.d.ts.map +1 -1
- package/dist/Machine.js +10 -3
- package/dist/Machine.js.map +1 -1
- package/dist/Query.d.ts +100 -14
- package/dist/Query.d.ts.map +1 -1
- package/dist/Query.js +34 -5
- package/dist/Query.js.map +1 -1
- package/dist/Relation.d.ts +5 -14
- package/dist/Relation.d.ts.map +1 -1
- package/dist/Relation.js +0 -32
- package/dist/Relation.js.map +1 -1
- package/dist/Runtime.d.ts +61 -15
- package/dist/Runtime.d.ts.map +1 -1
- package/dist/Runtime.js +594 -70
- package/dist/Runtime.js.map +1 -1
- package/dist/Schedule.d.ts +24 -15
- package/dist/Schedule.d.ts.map +1 -1
- package/dist/Schedule.js +2 -1
- package/dist/Schedule.js.map +1 -1
- package/dist/Schema.d.ts +233 -48
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +33 -7
- package/dist/Schema.js.map +1 -1
- package/dist/Snapshot.d.ts +90 -1
- package/dist/Snapshot.d.ts.map +1 -1
- package/dist/Snapshot.js +42 -1
- package/dist/Snapshot.js.map +1 -1
- package/dist/System.d.ts +132 -31
- package/dist/System.d.ts.map +1 -1
- package/dist/System.js +32 -0
- package/dist/System.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/cells.d.ts +2 -0
- package/dist/internal/cells.d.ts.map +1 -1
- package/dist/internal/cells.js +34 -8
- package/dist/internal/cells.js.map +1 -1
- package/dist/internal/debug.d.ts +10 -0
- package/dist/internal/debug.d.ts.map +1 -1
- package/dist/internal/debug.js +171 -12
- package/dist/internal/debug.js.map +1 -1
- package/dist/internal/equal.d.ts +8 -0
- package/dist/internal/equal.d.ts.map +1 -0
- package/dist/internal/equal.js +38 -0
- package/dist/internal/equal.js.map +1 -0
- package/dist/internal/fragments.d.ts +2 -6
- package/dist/internal/fragments.d.ts.map +1 -1
- package/dist/internal/fragments.js +36 -3
- package/dist/internal/fragments.js.map +1 -1
- package/dist/internal/game.d.ts +2 -0
- package/dist/internal/game.d.ts.map +1 -1
- package/dist/internal/game.js +48 -7
- package/dist/internal/game.js.map +1 -1
- package/dist/internal/order.d.ts.map +1 -1
- package/dist/internal/order.js +4 -2
- package/dist/internal/order.js.map +1 -1
- package/dist/internal/queries.d.ts.map +1 -1
- package/dist/internal/queries.js +57 -26
- package/dist/internal/queries.js.map +1 -1
- package/dist/internal/relations.d.ts +10 -0
- package/dist/internal/relations.d.ts.map +1 -0
- package/dist/internal/relations.js +32 -0
- package/dist/internal/relations.js.map +1 -0
- package/dist/internal/requirements.d.ts +26 -0
- package/dist/internal/requirements.d.ts.map +1 -0
- package/dist/internal/requirements.js +46 -0
- package/dist/internal/requirements.js.map +1 -0
- package/dist/internal/streams.d.ts +2 -0
- package/dist/internal/streams.d.ts.map +1 -1
- package/dist/internal/streams.js +10 -0
- package/dist/internal/streams.js.map +1 -1
- package/dist/internal/world.d.ts +7 -1
- package/dist/internal/world.d.ts.map +1 -1
- package/dist/internal/world.js +53 -3
- package/dist/internal/world.js.map +1 -1
- package/package.json +1 -1
- package/src/Clock.ts +29 -4
- package/src/Command.ts +281 -67
- package/src/Condition.ts +17 -1
- package/src/Debug.ts +124 -15
- package/src/Descriptor.ts +92 -21
- package/src/Entity.ts +23 -7
- package/src/EntityScope.ts +21 -2
- package/src/FixedLoop.ts +218 -0
- package/src/HostClock.ts +2 -1
- package/src/Machine.ts +72 -35
- package/src/Query.ts +118 -17
- package/src/Relation.ts +5 -67
- package/src/Runtime.ts +659 -85
- package/src/Schedule.ts +31 -19
- package/src/Schema.ts +297 -57
- package/src/Snapshot.ts +94 -2
- package/src/System.ts +151 -29
- package/src/index.ts +4 -0
- package/src/internal/cells.ts +42 -10
- package/src/internal/debug.ts +179 -14
- package/src/internal/equal.ts +31 -0
- package/src/internal/fragments.ts +35 -5
- package/src/internal/game.ts +69 -7
- package/src/internal/order.ts +8 -4
- package/src/internal/queries.ts +62 -12
- package/src/internal/relations.ts +52 -0
- package/src/internal/requirements.ts +71 -0
- package/src/internal/streams.ts +11 -0
- 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> =
|
|
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
|
-
/**
|
|
207
|
-
type
|
|
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
|
|
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,
|
|
247
|
+
type CommandWritersOf<Systems, Required, Named, ReaderSystem> =
|
|
237
248
|
Systems extends AnySystem
|
|
238
249
|
? IsErased<Systems["spec"]> extends true ? never
|
|
239
|
-
: Systems
|
|
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
|
|
247
|
-
: R extends DataRead<infer Kind, infer Key, infer
|
|
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
|
|
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.
|