Make World a single class, refactor of all query types

This commit is contained in:
EncodedVenom 2024-06-14 17:12:55 -04:00
parent 155a943b8c
commit 54022b36d1

26
lib/index.d.ts vendored
View file

@ -30,8 +30,6 @@ type ArchetypeMap = {
type ArchetypeRecord = number; type ArchetypeRecord = number;
export type Entity<T = unknown> = number & { __nominal_type_dont_use: T }
type EntityIndex = { type EntityIndex = {
dense: { dense: {
[key: i24]: i53 [key: i24]: i53
@ -48,13 +46,19 @@ type Record = {
componentRecord: ArchetypeMap, componentRecord: ArchetypeMap,
} }
type ExtractFromLuaTuple<T> = T extends LuaTuple<infer U> ? U : never; type Query<T extends Entity[]> = {
without: (...components: Entity[]) => Query<T>;
} & IterableFunction<LuaTuple<[Entity, ...T]>>
type QueryShim<T extends any[]> = { // Utility Types
without: (...args: ExtractFromLuaTuple<T>) => QueryShim<T>; export type Entity<T = unknown> = number & { __nominal_type_dont_use: T }
} & IterableFunction<T>; export type EntityType<T> = T extends Entity<infer A> ? A : never;
export type InferComponents<A extends Entity[]> = A & {
[K in keyof A]: EntityType<A[K]>
};
interface World {
export class World {
entity(): Entity; entity(): Entity;
component<T = unknown>(): Entity<T>; component<T = unknown>(): Entity<T>;
@ -70,15 +74,9 @@ interface World {
get<A, B, C>(id: number, component: Entity<A>, component2: Entity<B>, component3: Entity<C>): LuaTuple<[A, B, C]>; get<A, B, C>(id: number, component: Entity<A>, component2: Entity<B>, component3: Entity<C>): LuaTuple<[A, B, C]>;
get<A, B, C, D>(id: number, component: Entity<A>, component2: Entity<B>, component3: Entity<C>, component4: Entity<D>): LuaTuple<[A, B, C, D]>; get<A, B, C, D>(id: number, component: Entity<A>, component2: Entity<B>, component3: Entity<C>, component4: Entity<D>): LuaTuple<[A, B, C, D]>;
query<T extends unknown[]>(...entities: T): QueryShim<LuaTuple<[...T]>> query<T extends Entity[]>(...components: T): Query<InferComponents<T>>
} }
interface WorldConstructor {
new(): World
}
export const World: WorldConstructor;
export const pair: (pred: Entity, obj: Entity) => Entity; export const pair: (pred: Entity, obj: Entity) => Entity;
export const OnAdd: Entity; export const OnAdd: Entity;