From c7120e86081d5f9a5f9f4cff035dd00c7e68a7fb Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 14 Jan 2025 14:31:32 +0700 Subject: [PATCH 01/10] opt: get chunk by fragments without sorting --- evolved.lua | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/evolved.lua b/evolved.lua index 54f2da0..faf4618 100644 --- a/evolved.lua +++ b/evolved.lua @@ -3318,27 +3318,16 @@ function evolved.chunk(...) return end - ---@type evolved.fragment[] - local fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, fragment_count, 0) - - for i = 1, fragment_count do - local fragment = select(i, ...) - fragment_list[#fragment_list + 1] = fragment - end - - table.sort(fragment_list) - - local root_fragment = fragment_list[1] + local root_fragment = select(1, ...) local chunk = __root_chunks[root_fragment] or __root_chunk(root_fragment) for i = 2, fragment_count do - local child_fragment = fragment_list[i] + local child_fragment = select(i, ...) chunk = chunk.__with_fragment_edges[child_fragment] or __chunk_with_fragment(chunk, child_fragment) end - __release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, fragment_list) return chunk, chunk.__entities end From aa6d2c1c48c6c44e94b09fd058306d3cbb64981a Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Wed, 29 Oct 2025 19:24:07 +0300 Subject: [PATCH 02/10] feat: add Teal language definitions --- evolved..d.tl | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 evolved..d.tl diff --git a/evolved..d.tl b/evolved..d.tl new file mode 100644 index 0000000..49ea920 --- /dev/null +++ b/evolved..d.tl @@ -0,0 +1,184 @@ +-- evolved.d.tl +-- evolve.lua ver.: 1.4 +-- Teal declaration file for the public API of evolved.lua + +local record Evolved + + -- Basic alias types + type ID = number + type Entity = ID + type Fragment = ID + type Query = ID + type System = ID + + type Component = any + + -- This is helper interface to easier create Teal custom records which can be used as components + interface IComponent + end + + type Storage = { Component | IComponent } + + type EachState = {integer, Chunk, integer, integer} -- {[1] = structural_changes, [2] = entity_chunk, [3] = entity_place, [4] = chunk_fragment_index} + type ExecuteState = {integer, { Chunk }, integer, {Fragment: integer} | nil} -- {[1] = structural_changes, [2] = chunk_stack, [3] = chunk_stack_size, [4] = exclude_set} + + type EachIterator = function(EachState | nil): (Fragment | nil, Component | nil) + type ExecuteIterator = function(EachState | nil): (Chunk | nil, { Entity } | nil, integer | nil) + + type Execute = function(Chunk, { Entity }, integer) + type Prologue = function() + type Epilogue = function() + + type SetHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent, old?: Component | IComponent) + type AssignHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent, old?: Component | IComponent) + type InsertHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent) + type RemoveHook = function(entity: Entity, fragment: Fragment, component: Component | IComponent) + + record Chunk + alive: function(self: Chunk): boolean + empty: function(self: Chunk): boolean + has: function(self: Chunk, fragment: Fragment): boolean + has_all: function(self: Chunk, ...: Fragment): boolean + has_any: function(self: Chunk, ...: Fragment): boolean + entities: function(self: Chunk): ({ Entity }, number) + fragments: function(self: Chunk): ({ Fragment }, number) + components: function(self: Chunk, ...: Fragment): Storage... + end + + record Builder + build: function(self: Builder, prefab?: Entity): Entity + multi_build: function(self: Builder, entity_count: number, prefab?: Entity): ({ Entity }, number) + + spawn: function(self: Builder): Entity + multi_spawn: function(self: Builder, entity_count: number): ({ Entity }, number) + + clone: function(self: Builder, prefab: Entity): Entity + multi_clone: function(self: Builder, entity_count: number, prefab: Entity): ({ Entity }, number) + + has: function(self: Builder, fragment: Fragment): boolean + has_all: function(self: Builder, ...: Fragment): boolean + has_any: function(self: Builder, ...: Fragment): boolean + get: function(self: Builder, ...: Fragment): Component... + + set: function(self: Builder, fragment: Fragment, component?: Component | IComponent): Builder + remove: function(self: Builder, ...: Fragment): Builder + clear: function(self: Builder): any + + tag: function(self: Builder): Builder + name: function(self: Builder, name: string): Builder + + unique: function(self: Builder): Builder + explicit: function(self: Builder): Builder + internal: function(self: Builder): Builder + + default: function(self: Builder, default: Component | IComponent): Builder + duplicate: function(self: Builder, duplicate: function(Component | IComponent): Component): Builder + prefab: function(self: Builder): Builder + disabled: function(self: Builder): Builder + + include: function(self: Builder, ...: Fragment): Builder + exclude: function(self: Builder, ...: Fragment): Builder + require: function(self: Builder, ...: Fragment): Builder + + on_set: function(self: Builder, on_set: SetHook): Builder + on_assign: function(self: Builder, on_assign: AssignHook): Builder + on_insert: function(self: Builder, on_insert: InsertHook): Builder + on_remove: function(self: Builder, on_remove: RemoveHook): Builder + group: function(self: Builder, group: System): Builder + + query: function(self: Builder, q: Query): Builder + execute: function(self: Builder, exec_fn: Execute): Builder + + prologue: function(self: Builder, p: Prologue): Builder + epilogue: function(self: Builder, e: Epilogue): Builder + + destruction_policy: function(self: Builder, policy: ID): Builder + end + + TAG: Fragment + NAME: Fragment + + UNIQUE: Fragment + EXPLICIT: Fragment + INTERNAL: Fragment + + DEFAULT: Fragment + DUPLICATE: Fragment + + PREFAB: Fragment + DISABLED: Fragment + + INCLUDES: Fragment + EXCLUDES: Fragment + REQUIRES: Fragment + + ON_SET: Fragment + ON_ASSIGN: Fragment + ON_INSERT: Fragment + ON_REMOVE: Fragment + + GROUP: Fragment + + QUERY: Fragment + EXECUTE: Fragment + PROLOGUE: Fragment + EPILOGUE: Fragment + + DESTRUCTION_POLICY: Fragment + DESTRUCTION_POLICY_DESTROY_ENTITY: ID + DESTRUCTION_POLICY_REMOVE_FRAGMENT: ID + + id: function(count?: number): ID + name: function(...: ID): string... + + pack: function(primary: number, secondary: number): ID + unpack: function(id: ID): (number, number) + + defer: function(): boolean + commit: function(): boolean + cancel: function(): boolean + + spawn: function(components?: { Fragment: Component | IComponent }): Entity + multi_spawn: function(entity_count: number, components?: { Fragment: Component | IComponent }): ({ Entity }, number) + + clone: function(prefab: Entity, components?: { Fragment: Component | IComponent }): Entity + multi_clone: function(entity_count: number, prefab: Entity, components?: { Fragment: Component | IComponent }): ({ Entity }, number) + + alive: function(entity: Entity): boolean + alive_all: function(...: Entity): boolean + alive_any: function(...: Entity): boolean + + empty: function(entity: Entity): boolean + empty_all: function(...: Entity): boolean + empty_any: function(...: Entity): boolean + + has: function(entity: Entity, fragment: Fragment): boolean + has_all: function(entity: Entity, ...: Fragment): boolean + has_any: function(entity: Entity, ...: Fragment): boolean + + get: function(entity: Entity, ...: Fragment): Component... + set: function(entity: Entity, fragment: Fragment, component: Component | IComponent) + remove: function(entity: Entity, ...: Fragment) + clear: function(...: Entity) + destroy: function(...: Entity) + + batch_set: function(q: Query, fragment: Fragment, component: Component | IComponent) + batch_remove: function(q: Query, ...: Fragment) + batch_clear: function(...: Query) + batch_destroy: function(...: Query) + + each: function(entity: Entity): (EachIterator, EachState | nil) + execute: function(q: Query): (ExecuteIterator, ExecuteState | nil) + locate: function(entity: Entity): (any | nil, number) + + process: function(...: System) + debug_mode: function(yesno: boolean) + collect_garbage: function() + + chunk: function(first_fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) + builder: function(): Builder +end + +return Evolved + + \ No newline at end of file From a81a8646e996d72e9b1b7feedded0f789de39b80 Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Wed, 29 Oct 2025 19:29:56 +0300 Subject: [PATCH 03/10] fix: wrong file name --- evolved..d.tl => evolved.d.tl | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename evolved..d.tl => evolved.d.tl (100%) diff --git a/evolved..d.tl b/evolved.d.tl similarity index 100% rename from evolved..d.tl rename to evolved.d.tl From dc642f52940fcff70d3a4ca17bcd526e558cdfdb Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Sun, 2 Nov 2025 21:12:26 +0300 Subject: [PATCH 04/10] fix: fixes after review --- evolved.d.tl | 277 ++++++++++++++++++++++++--------------------------- 1 file changed, 131 insertions(+), 146 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index 49ea920..c125555 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -1,184 +1,169 @@ --- evolved.d.tl +-- evolved.d.tl -- evolve.lua ver.: 1.4 -- Teal declaration file for the public API of evolved.lua local record Evolved - -- Basic alias types - type ID = number - type Entity = ID - type Fragment = ID - type Query = ID - type System = ID + record ID + end - type Component = any + type Entity = ID + type Fragment = ID + type Query = ID + type System = ID - -- This is helper interface to easier create Teal custom records which can be used as components - interface IComponent - end + interface IComponent + end + + type Component = any | IComponent - type Storage = { Component | IComponent } + type Storage = { Component } + type EachState = { integer, Chunk, integer, integer } + type ExecuteState = { integer, { Chunk }, integer, {Fragment: integer} | nil } - type EachState = {integer, Chunk, integer, integer} -- {[1] = structural_changes, [2] = entity_chunk, [3] = entity_place, [4] = chunk_fragment_index} - type ExecuteState = {integer, { Chunk }, integer, {Fragment: integer} | nil} -- {[1] = structural_changes, [2] = chunk_stack, [3] = chunk_stack_size, [4] = exclude_set} + type EachIterator = function(state?: EachState): (Fragment | nil, Component | nil) + type ExecuteIterator = function(state?: ExecuteState): (Chunk | nil, { Entity } | nil, integer | nil) - type EachIterator = function(EachState | nil): (Fragment | nil, Component | nil) - type ExecuteIterator = function(EachState | nil): (Chunk | nil, { Entity } | nil, integer | nil) + type Execute = function(chunk: Chunk, entity_list: { Entity }, entity_count: integer) + type Prologue = function() + type Epilogue = function() - type Execute = function(Chunk, { Entity }, integer) - type Prologue = function() - type Epilogue = function() + type SetHook = function(entity: Entity, fragment: Fragment, new: Component, old?: Component) + type AssignHook = function(entity: Entity, fragment: Fragment, new: Component, old?: Component) + type InsertHook = function(entity: Entity, fragment: Fragment, new: Component) + type RemoveHook = function(entity: Entity, fragment: Fragment, component: Component) - type SetHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent, old?: Component | IComponent) - type AssignHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent, old?: Component | IComponent) - type InsertHook = function(entity: Entity, fragment: Fragment, new: Component | IComponent) - type RemoveHook = function(entity: Entity, fragment: Fragment, component: Component | IComponent) + record Chunk + alive: function(self: Chunk): boolean + empty: function(self: Chunk): boolean + has: function(self: Chunk, fragment: Fragment): boolean + has_all: function(self: Chunk, ...: Fragment): boolean + has_any: function(self: Chunk, ...: Fragment): boolean + entities: function(self: Chunk): ({ Entity }, number) + fragments: function(self: Chunk): ({ Fragment }, number) + components: function(self: Chunk, ...: Fragment): Storage... + end - record Chunk - alive: function(self: Chunk): boolean - empty: function(self: Chunk): boolean - has: function(self: Chunk, fragment: Fragment): boolean - has_all: function(self: Chunk, ...: Fragment): boolean - has_any: function(self: Chunk, ...: Fragment): boolean - entities: function(self: Chunk): ({ Entity }, number) - fragments: function(self: Chunk): ({ Fragment }, number) - components: function(self: Chunk, ...: Fragment): Storage... - end + record Builder + build: function(self: Builder, prefab?: Entity): Entity + multi_build: function(self: Builder, entity_count: number, prefab?: Entity): ({ Entity }, number) + spawn: function(self: Builder): Entity + multi_spawn: function(self: Builder, entity_count: number): ({ Entity }, number) + clone: function(self: Builder, prefab: Entity): Entity + multi_clone: function(self: Builder, entity_count: number, prefab: Entity): ({ Entity }, number) + has: function(self: Builder, fragment: Fragment): boolean + has_all: function(self: Builder, ...: Fragment): boolean + has_any: function(self: Builder, ...: Fragment): boolean + get: function(self: Builder, ...: Fragment): Component... + set: function(self: Builder, fragment: Fragment, component?: Component): Builder + remove: function(self: Builder, ...: Fragment): Builder + clear: function(self: Builder): Builder + tag: function(self: Builder): Builder + name: function(self: Builder, name: string): Builder + unique: function(self: Builder): Builder + explicit: function(self: Builder): Builder + internal: function(self: Builder): Builder + default: function(self: Builder, default: Component): Builder + duplicate: function(self: Builder, duplicate: function(Component): Component): Builder + prefab: function(self: Builder): Builder + disabled: function(self: Builder): Builder + include: function(self: Builder, ...: Fragment): Builder + exclude: function(self: Builder, ...: Fragment): Builder + require: function(self: Builder, ...: Fragment): Builder + on_set: function(self: Builder, on_set: SetHook): Builder + on_assign: function(self: Builder, on_assign: AssignHook): Builder + on_insert: function(self: Builder, on_insert: InsertHook): Builder + on_remove: function(self: Builder, on_remove: RemoveHook): Builder + group: function(self: Builder, group: System): Builder + query: function(self: Builder, q: Query): Builder + execute: function(self: Builder, exec_fn: Execute): Builder + prologue: function(self: Builder, p: Prologue): Builder + epilogue: function(self: Builder, e: Epilogue): Builder + destruction_policy: function(self: Builder, policy: ID): Builder + end - record Builder - build: function(self: Builder, prefab?: Entity): Entity - multi_build: function(self: Builder, entity_count: number, prefab?: Entity): ({ Entity }, number) + TAG: Fragment + NAME: Fragment - spawn: function(self: Builder): Entity - multi_spawn: function(self: Builder, entity_count: number): ({ Entity }, number) + UNIQUE: Fragment + EXPLICIT: Fragment + INTERNAL: Fragment - clone: function(self: Builder, prefab: Entity): Entity - multi_clone: function(self: Builder, entity_count: number, prefab: Entity): ({ Entity }, number) + DEFAULT: Fragment + DUPLICATE: Fragment - has: function(self: Builder, fragment: Fragment): boolean - has_all: function(self: Builder, ...: Fragment): boolean - has_any: function(self: Builder, ...: Fragment): boolean - get: function(self: Builder, ...: Fragment): Component... + PREFAB: Fragment + DISABLED: Fragment - set: function(self: Builder, fragment: Fragment, component?: Component | IComponent): Builder - remove: function(self: Builder, ...: Fragment): Builder - clear: function(self: Builder): any + INCLUDES: Fragment + EXCLUDES: Fragment + REQUIRES: Fragment - tag: function(self: Builder): Builder - name: function(self: Builder, name: string): Builder + ON_SET: Fragment + ON_ASSIGN: Fragment + ON_INSERT: Fragment + ON_REMOVE: Fragment - unique: function(self: Builder): Builder - explicit: function(self: Builder): Builder - internal: function(self: Builder): Builder + GROUP: Fragment - default: function(self: Builder, default: Component | IComponent): Builder - duplicate: function(self: Builder, duplicate: function(Component | IComponent): Component): Builder - prefab: function(self: Builder): Builder - disabled: function(self: Builder): Builder + QUERY: Fragment + EXECUTE: Fragment + PROLOGUE: Fragment + EPILOGUE: Fragment - include: function(self: Builder, ...: Fragment): Builder - exclude: function(self: Builder, ...: Fragment): Builder - require: function(self: Builder, ...: Fragment): Builder + DESTRUCTION_POLICY: Fragment + DESTRUCTION_POLICY_DESTROY_ENTITY: ID + DESTRUCTION_POLICY_REMOVE_FRAGMENT: ID - on_set: function(self: Builder, on_set: SetHook): Builder - on_assign: function(self: Builder, on_assign: AssignHook): Builder - on_insert: function(self: Builder, on_insert: InsertHook): Builder - on_remove: function(self: Builder, on_remove: RemoveHook): Builder - group: function(self: Builder, group: System): Builder + id: function(count?: number): ID... + name: function(...: ID): string... - query: function(self: Builder, q: Query): Builder - execute: function(self: Builder, exec_fn: Execute): Builder + pack: function(primary: number, secondary: number): ID + unpack: function(id: ID): (number, number) - prologue: function(self: Builder, p: Prologue): Builder - epilogue: function(self: Builder, e: Epilogue): Builder + defer: function(): boolean + commit: function(): boolean + cancel: function(): boolean - destruction_policy: function(self: Builder, policy: ID): Builder - end + spawn: function(components?: { Fragment: Component }): Entity + multi_spawn: function(entity_count: number, components?: { Fragment: Component }): ({ Entity }, number) - TAG: Fragment - NAME: Fragment + clone: function(prefab: Entity, components?: { Fragment: Component }): Entity + multi_clone: function(entity_count: number, prefab: Entity, components?: { Fragment: Component }): ({ Entity }, number) - UNIQUE: Fragment - EXPLICIT: Fragment - INTERNAL: Fragment + alive: function(entity: Entity): boolean + alive_all: function(...: Entity): boolean + alive_any: function(...: Entity): boolean - DEFAULT: Fragment - DUPLICATE: Fragment + empty: function(entity: Entity): boolean + empty_all: function(...: Entity): boolean + empty_any: function(...: Entity): boolean - PREFAB: Fragment - DISABLED: Fragment + has: function(entity: Entity, fragment: Fragment): boolean + has_all: function(entity: Entity, ...: Fragment): boolean + has_any: function(entity: Entity, ...: Fragment): boolean - INCLUDES: Fragment - EXCLUDES: Fragment - REQUIRES: Fragment + get: function(entity: Entity, ...: Fragment): Component... + set: function(entity: Entity, fragment: Fragment, component: Component) + remove: function(entity: Entity, ...: Fragment) + clear: function(...: Entity) + destroy: function(...: Entity) - ON_SET: Fragment - ON_ASSIGN: Fragment - ON_INSERT: Fragment - ON_REMOVE: Fragment + batch_set: function(q: Query, fragment: Fragment, component: Component) + batch_remove: function(q: Query, ...: Fragment) + batch_clear: function(...: Query) + batch_destroy: function(...: Query) - GROUP: Fragment + each: function(entity: Entity): (EachIterator, EachState | nil) + execute: function(q: Query): (ExecuteIterator, ExecuteState | nil) + locate: function(entity: Entity): (any | nil, number) - QUERY: Fragment - EXECUTE: Fragment - PROLOGUE: Fragment - EPILOGUE: Fragment + process: function(...: System) + debug_mode: function(yesno: boolean) + collect_garbage: function() - DESTRUCTION_POLICY: Fragment - DESTRUCTION_POLICY_DESTROY_ENTITY: ID - DESTRUCTION_POLICY_REMOVE_FRAGMENT: ID - - id: function(count?: number): ID - name: function(...: ID): string... - - pack: function(primary: number, secondary: number): ID - unpack: function(id: ID): (number, number) - - defer: function(): boolean - commit: function(): boolean - cancel: function(): boolean - - spawn: function(components?: { Fragment: Component | IComponent }): Entity - multi_spawn: function(entity_count: number, components?: { Fragment: Component | IComponent }): ({ Entity }, number) - - clone: function(prefab: Entity, components?: { Fragment: Component | IComponent }): Entity - multi_clone: function(entity_count: number, prefab: Entity, components?: { Fragment: Component | IComponent }): ({ Entity }, number) - - alive: function(entity: Entity): boolean - alive_all: function(...: Entity): boolean - alive_any: function(...: Entity): boolean - - empty: function(entity: Entity): boolean - empty_all: function(...: Entity): boolean - empty_any: function(...: Entity): boolean - - has: function(entity: Entity, fragment: Fragment): boolean - has_all: function(entity: Entity, ...: Fragment): boolean - has_any: function(entity: Entity, ...: Fragment): boolean - - get: function(entity: Entity, ...: Fragment): Component... - set: function(entity: Entity, fragment: Fragment, component: Component | IComponent) - remove: function(entity: Entity, ...: Fragment) - clear: function(...: Entity) - destroy: function(...: Entity) - - batch_set: function(q: Query, fragment: Fragment, component: Component | IComponent) - batch_remove: function(q: Query, ...: Fragment) - batch_clear: function(...: Query) - batch_destroy: function(...: Query) - - each: function(entity: Entity): (EachIterator, EachState | nil) - execute: function(q: Query): (ExecuteIterator, ExecuteState | nil) - locate: function(entity: Entity): (any | nil, number) - - process: function(...: System) - debug_mode: function(yesno: boolean) - collect_garbage: function() - - chunk: function(first_fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) - builder: function(): Builder + chunk: function(first_fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) + builder: function(): Builder end return Evolved - - \ No newline at end of file From 1bb0089e9f618f6c7346f141a71f00916fa552c1 Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Sun, 2 Nov 2025 21:21:25 +0300 Subject: [PATCH 05/10] fix: functions arguments naming --- evolved.d.tl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index c125555..1ccc922 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -14,7 +14,7 @@ local record Evolved interface IComponent end - + type Component = any | IComponent type Storage = { Component } @@ -75,10 +75,10 @@ local record Evolved on_insert: function(self: Builder, on_insert: InsertHook): Builder on_remove: function(self: Builder, on_remove: RemoveHook): Builder group: function(self: Builder, group: System): Builder - query: function(self: Builder, q: Query): Builder - execute: function(self: Builder, exec_fn: Execute): Builder - prologue: function(self: Builder, p: Prologue): Builder - epilogue: function(self: Builder, e: Epilogue): Builder + query: function(self: Builder, query: Query): Builder + execute: function(self: Builder, execute: Execute): Builder + prologue: function(self: Builder, prologue: Prologue): Builder + epilogue: function(self: Builder, epilogue: Epilogue): Builder destruction_policy: function(self: Builder, policy: ID): Builder end @@ -149,20 +149,20 @@ local record Evolved clear: function(...: Entity) destroy: function(...: Entity) - batch_set: function(q: Query, fragment: Fragment, component: Component) - batch_remove: function(q: Query, ...: Fragment) + batch_set: function(query: Query, fragment: Fragment, component: Component) + batch_remove: function(query: Query, ...: Fragment) batch_clear: function(...: Query) batch_destroy: function(...: Query) each: function(entity: Entity): (EachIterator, EachState | nil) - execute: function(q: Query): (ExecuteIterator, ExecuteState | nil) + execute: function(query: Query): (ExecuteIterator, ExecuteState | nil) locate: function(entity: Entity): (any | nil, number) process: function(...: System) debug_mode: function(yesno: boolean) collect_garbage: function() - chunk: function(first_fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) + chunk: function(fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) builder: function(): Builder end From 67002503edccec896a7ede12ee1f2f1a04edf8d6 Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Mon, 3 Nov 2025 11:57:18 +0300 Subject: [PATCH 06/10] fix: removed IComponent and added generics for functions and hooks that take Component as a single argument --- evolved.d.tl | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index 1ccc922..e1c2925 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -11,11 +11,7 @@ local record Evolved type Fragment = ID type Query = ID type System = ID - - interface IComponent - end - - type Component = any | IComponent + type Component = any type Storage = { Component } type EachState = { integer, Chunk, integer, integer } @@ -28,10 +24,10 @@ local record Evolved type Prologue = function() type Epilogue = function() - type SetHook = function(entity: Entity, fragment: Fragment, new: Component, old?: Component) - type AssignHook = function(entity: Entity, fragment: Fragment, new: Component, old?: Component) - type InsertHook = function(entity: Entity, fragment: Fragment, new: Component) - type RemoveHook = function(entity: Entity, fragment: Fragment, component: Component) + type SetHook = function(entity: Entity, fragment: Fragment, new: T, old?: T) + type AssignHook = function(entity: Entity, fragment: Fragment, new: T, old?: T) + type InsertHook = function(entity: Entity, fragment: Fragment, new: T) + type RemoveHook = function(entity: Entity, fragment: Fragment, component: T) record Chunk alive: function(self: Chunk): boolean @@ -55,7 +51,7 @@ local record Evolved has_all: function(self: Builder, ...: Fragment): boolean has_any: function(self: Builder, ...: Fragment): boolean get: function(self: Builder, ...: Fragment): Component... - set: function(self: Builder, fragment: Fragment, component?: Component): Builder + set: function(self: Builder, fragment: Fragment, component?: T): Builder remove: function(self: Builder, ...: Fragment): Builder clear: function(self: Builder): Builder tag: function(self: Builder): Builder @@ -63,17 +59,17 @@ local record Evolved unique: function(self: Builder): Builder explicit: function(self: Builder): Builder internal: function(self: Builder): Builder - default: function(self: Builder, default: Component): Builder - duplicate: function(self: Builder, duplicate: function(Component): Component): Builder + default: function(self: Builder, default: T): Builder + duplicate: function(self: Builder, duplicate: function(T): T): Builder prefab: function(self: Builder): Builder disabled: function(self: Builder): Builder include: function(self: Builder, ...: Fragment): Builder exclude: function(self: Builder, ...: Fragment): Builder require: function(self: Builder, ...: Fragment): Builder - on_set: function(self: Builder, on_set: SetHook): Builder - on_assign: function(self: Builder, on_assign: AssignHook): Builder - on_insert: function(self: Builder, on_insert: InsertHook): Builder - on_remove: function(self: Builder, on_remove: RemoveHook): Builder + on_set: function(self: Builder, on_set: SetHook): Builder + on_assign: function(self: Builder, on_assign: AssignHook): Builder + on_insert: function(self: Builder, on_insert: InsertHook): Builder + on_remove: function(self: Builder, on_remove: RemoveHook): Builder group: function(self: Builder, group: System): Builder query: function(self: Builder, query: Query): Builder execute: function(self: Builder, execute: Execute): Builder @@ -144,12 +140,12 @@ local record Evolved has_any: function(entity: Entity, ...: Fragment): boolean get: function(entity: Entity, ...: Fragment): Component... - set: function(entity: Entity, fragment: Fragment, component: Component) + set: function(entity: Entity, fragment: Fragment, component: T) remove: function(entity: Entity, ...: Fragment) clear: function(...: Entity) destroy: function(...: Entity) - batch_set: function(query: Query, fragment: Fragment, component: Component) + batch_set: function(query: Query, fragment: Fragment, component: T) batch_remove: function(query: Query, ...: Fragment) batch_clear: function(...: Query) batch_destroy: function(...: Query) From 825eba5328e3dd8299ef73a6adb1ae4d491dd31c Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Tue, 4 Nov 2025 10:06:01 +0300 Subject: [PATCH 07/10] fix: remove teal types for internal usage --- evolved.d.tl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index e1c2925..d6866e0 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -14,11 +14,9 @@ local record Evolved type Component = any type Storage = { Component } - type EachState = { integer, Chunk, integer, integer } - type ExecuteState = { integer, { Chunk }, integer, {Fragment: integer} | nil } - type EachIterator = function(state?: EachState): (Fragment | nil, Component | nil) - type ExecuteIterator = function(state?: ExecuteState): (Chunk | nil, { Entity } | nil, integer | nil) + type EachIterator = function(): (Fragment, Component) + type ExecuteIterator = function(): (Chunk, { Entity }, integer) type Execute = function(chunk: Chunk, entity_list: { Entity }, entity_count: integer) type Prologue = function() @@ -150,9 +148,9 @@ local record Evolved batch_clear: function(...: Query) batch_destroy: function(...: Query) - each: function(entity: Entity): (EachIterator, EachState | nil) - execute: function(query: Query): (ExecuteIterator, ExecuteState | nil) - locate: function(entity: Entity): (any | nil, number) + each: function(entity: Entity): EachIterator + execute: function(query: Query): ExecuteIterator + locate: function(entity: Entity): (any, number) process: function(...: System) debug_mode: function(yesno: boolean) From f1ba9ab9096e0b8fce63ea7a49f9a4e1c6b57ca0 Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Tue, 4 Nov 2025 18:56:02 +0300 Subject: [PATCH 08/10] fix: replace number type with integer; EachState\ExecuteState records --- evolved.d.tl | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index d6866e0..285666e 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -15,8 +15,14 @@ local record Evolved type Storage = { Component } - type EachIterator = function(): (Fragment, Component) - type ExecuteIterator = function(): (Chunk, { Entity }, integer) + record EachState + end + + record ExecuteState + end + + type EachIterator = function(state?: EachState): (Fragment, Component) + type ExecuteIterator = function(state?: ExecuteState): (Chunk, { Entity }, integer) type Execute = function(chunk: Chunk, entity_list: { Entity }, entity_count: integer) type Prologue = function() @@ -33,18 +39,18 @@ local record Evolved has: function(self: Chunk, fragment: Fragment): boolean has_all: function(self: Chunk, ...: Fragment): boolean has_any: function(self: Chunk, ...: Fragment): boolean - entities: function(self: Chunk): ({ Entity }, number) - fragments: function(self: Chunk): ({ Fragment }, number) + entities: function(self: Chunk): ({ Entity }, integer) + fragments: function(self: Chunk): ({ Fragment }, integer) components: function(self: Chunk, ...: Fragment): Storage... end record Builder build: function(self: Builder, prefab?: Entity): Entity - multi_build: function(self: Builder, entity_count: number, prefab?: Entity): ({ Entity }, number) + multi_build: function(self: Builder, entity_count: integer, prefab?: Entity): ({ Entity }, integer) spawn: function(self: Builder): Entity - multi_spawn: function(self: Builder, entity_count: number): ({ Entity }, number) + multi_spawn: function(self: Builder, entity_count: integer): ({ Entity }, integer) clone: function(self: Builder, prefab: Entity): Entity - multi_clone: function(self: Builder, entity_count: number, prefab: Entity): ({ Entity }, number) + multi_clone: function(self: Builder, entity_count: integer, prefab: Entity): ({ Entity }, integer) has: function(self: Builder, fragment: Fragment): boolean has_all: function(self: Builder, ...: Fragment): boolean has_any: function(self: Builder, ...: Fragment): boolean @@ -109,21 +115,21 @@ local record Evolved DESTRUCTION_POLICY_DESTROY_ENTITY: ID DESTRUCTION_POLICY_REMOVE_FRAGMENT: ID - id: function(count?: number): ID... + id: function(count?: integer): ID... name: function(...: ID): string... - pack: function(primary: number, secondary: number): ID - unpack: function(id: ID): (number, number) + pack: function(primary: integer, secondary: integer): ID + unpack: function(id: ID): (integer, integer) defer: function(): boolean commit: function(): boolean cancel: function(): boolean spawn: function(components?: { Fragment: Component }): Entity - multi_spawn: function(entity_count: number, components?: { Fragment: Component }): ({ Entity }, number) + multi_spawn: function(entity_count: integer, components?: { Fragment: Component }): ({ Entity }, integer) clone: function(prefab: Entity, components?: { Fragment: Component }): Entity - multi_clone: function(entity_count: number, prefab: Entity, components?: { Fragment: Component }): ({ Entity }, number) + multi_clone: function(entity_count: integer, prefab: Entity, components?: { Fragment: Component }): ({ Entity }, integer) alive: function(entity: Entity): boolean alive_all: function(...: Entity): boolean @@ -148,9 +154,9 @@ local record Evolved batch_clear: function(...: Query) batch_destroy: function(...: Query) - each: function(entity: Entity): EachIterator - execute: function(query: Query): ExecuteIterator - locate: function(entity: Entity): (any, number) + each: function(entity: Entity): (EachIterator, EachState) + execute: function(query: Query): (ExecuteIterator, ExecuteState) + locate: function(entity: Entity): (Chunk, integer) process: function(...: System) debug_mode: function(yesno: boolean) From cfd68767cf9d266955a3341173aca2927fbf49e5 Mon Sep 17 00:00:00 2001 From: p0sel0k Date: Tue, 4 Nov 2025 21:57:00 +0300 Subject: [PATCH 09/10] fix: set and batch_set component argument should be optional --- evolved.d.tl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/evolved.d.tl b/evolved.d.tl index 285666e..15e9101 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -144,12 +144,12 @@ local record Evolved has_any: function(entity: Entity, ...: Fragment): boolean get: function(entity: Entity, ...: Fragment): Component... - set: function(entity: Entity, fragment: Fragment, component: T) + set: function(entity: Entity, fragment: Fragment, component?: T) remove: function(entity: Entity, ...: Fragment) clear: function(...: Entity) destroy: function(...: Entity) - batch_set: function(query: Query, fragment: Fragment, component: T) + batch_set: function(query: Query, fragment: Fragment, component?: T) batch_remove: function(query: Query, ...: Fragment) batch_clear: function(...: Query) batch_destroy: function(...: Query) From 07902eb184eec7dfed496aa8c8fa4d876ac7be2b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 7 Nov 2025 23:26:45 +0700 Subject: [PATCH 10/10] teal definitions cleanup --- .vscode/settings.json | 2 +- README.md | 7 +- evolved.d.tl | 148 +++++++++++++++++++++++------------------- evolved.lua | 6 +- 4 files changed, 90 insertions(+), 73 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b8d220a..0295d93 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "[json][jsonc][lua][markdown][yaml]": { + "[json][jsonc][lua][markdown][teal][yaml]": { "editor.formatOnSave": true, "files.insertFinalNewline": true, "files.trimFinalNewlines": true, diff --git a/README.md b/README.md index ee6cd2a..df5985e 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,7 @@ - [Chunk](#chunk) - [Builder](#builder) - [Changelog](#changelog) + - [vX.X.X](#vxxx) - [v1.4.0](#v140) - [v1.3.0](#v130) - [v1.2.0](#v120) @@ -1305,6 +1306,10 @@ builder_mt:destruction_policy :: id -> builder ## Changelog +### vX.X.X + +- Added basic [Teal](https://github.com/teal-language) type definitions, thanks to [@p0sel0k](https://github.com/p0sel0k) + ### v1.4.0 - Improved query execution performance by caching some internal calculations @@ -1944,7 +1949,7 @@ function evolved.builder_mt:internal() end #### `evolved.builder_mt:default` ```lua ----@param default evolved.component +---@param default evolved.default ---@return evolved.builder builder function evolved.builder_mt:default(default) end ``` diff --git a/evolved.d.tl b/evolved.d.tl index 15e9101..07ee3fe 100644 --- a/evolved.d.tl +++ b/evolved.d.tl @@ -1,85 +1,90 @@ --- evolved.d.tl --- evolve.lua ver.: 1.4 --- Teal declaration file for the public API of evolved.lua +local record Evolved + interface Id end -local record Evolved + type Entity = Id + type Fragment = Id + type Query = Id + type System = Id - record ID - end + interface EachState end + interface ExecuteState end - type Entity = ID - type Fragment = ID - type Query = ID - type System = ID - type Component = any + type EachIterator = function(state?: EachState): Fragment, any + type ExecuteIterator = function(state?: ExecuteState): Chunk, { Entity }, integer - type Storage = { Component } - - record EachState - end - - record ExecuteState - end - - type EachIterator = function(state?: EachState): (Fragment, Component) - type ExecuteIterator = function(state?: ExecuteState): (Chunk, { Entity }, integer) - - type Execute = function(chunk: Chunk, entity_list: { Entity }, entity_count: integer) - type Prologue = function() - type Epilogue = function() - - type SetHook = function(entity: Entity, fragment: Fragment, new: T, old?: T) - type AssignHook = function(entity: Entity, fragment: Fragment, new: T, old?: T) - type InsertHook = function(entity: Entity, fragment: Fragment, new: T) - type RemoveHook = function(entity: Entity, fragment: Fragment, component: T) - - record Chunk + interface Chunk alive: function(self: Chunk): boolean empty: function(self: Chunk): boolean + has: function(self: Chunk, fragment: Fragment): boolean has_all: function(self: Chunk, ...: Fragment): boolean has_any: function(self: Chunk, ...: Fragment): boolean - entities: function(self: Chunk): ({ Entity }, integer) - fragments: function(self: Chunk): ({ Fragment }, integer) - components: function(self: Chunk, ...: Fragment): Storage... + + entities: function(self: Chunk): { Entity }, integer + fragments: function(self: Chunk): { Fragment }, integer + + components: function(self: Chunk) + components: function(self: Chunk, f1: Fragment): { C1 } + components: function(self: Chunk, f1: Fragment, f2: Fragment): { C1 }, { C2 } + components: function(self: Chunk, f1: Fragment, f2: Fragment, f3: Fragment): { C1 }, { C2 }, { C3 } + components: function(self: Chunk, f1: Fragment, f2: Fragment, f3: Fragment, f4: Fragment): { C1 }, { C2 }, { C3 }, { C4 } end - record Builder + interface Builder build: function(self: Builder, prefab?: Entity): Entity - multi_build: function(self: Builder, entity_count: integer, prefab?: Entity): ({ Entity }, integer) + multi_build: function(self: Builder, entity_count: integer, prefab?: Entity): { Entity }, integer + spawn: function(self: Builder): Entity - multi_spawn: function(self: Builder, entity_count: integer): ({ Entity }, integer) + multi_spawn: function(self: Builder, entity_count: integer): { Entity }, integer + clone: function(self: Builder, prefab: Entity): Entity - multi_clone: function(self: Builder, entity_count: integer, prefab: Entity): ({ Entity }, integer) + multi_clone: function(self: Builder, entity_count: integer, prefab: Entity): { Entity }, integer + has: function(self: Builder, fragment: Fragment): boolean has_all: function(self: Builder, ...: Fragment): boolean has_any: function(self: Builder, ...: Fragment): boolean - get: function(self: Builder, ...: Fragment): Component... - set: function(self: Builder, fragment: Fragment, component?: T): Builder + + get: function(self: Builder) + get: function(self: Builder, f1: Fragment): C1 | nil + get: function(self: Builder, f1: Fragment, f2: Fragment): C1 | nil, C2 | nil + get: function(self: Builder, f1: Fragment, f2: Fragment, f3: Fragment): C1 | nil, C2 | nil, C3 | nil + get: function(self: Builder, f1: Fragment, f2: Fragment, f3: Fragment, f4: Fragment): C1 | nil, C2 | nil, C3 | nil, C4 | nil + + set: function(self: Builder, fragment: Fragment, component?: Component): Builder remove: function(self: Builder, ...: Fragment): Builder clear: function(self: Builder): Builder + tag: function(self: Builder): Builder name: function(self: Builder, name: string): Builder + unique: function(self: Builder): Builder explicit: function(self: Builder): Builder internal: function(self: Builder): Builder - default: function(self: Builder, default: T): Builder - duplicate: function(self: Builder, duplicate: function(T): T): Builder + + default: function(self: Builder, default: Component): Builder + duplicate: function(self: Builder, duplicate: function(Component): Component): Builder + prefab: function(self: Builder): Builder disabled: function(self: Builder): Builder + include: function(self: Builder, ...: Fragment): Builder exclude: function(self: Builder, ...: Fragment): Builder require: function(self: Builder, ...: Fragment): Builder - on_set: function(self: Builder, on_set: SetHook): Builder - on_assign: function(self: Builder, on_assign: AssignHook): Builder - on_insert: function(self: Builder, on_insert: InsertHook): Builder - on_remove: function(self: Builder, on_remove: RemoveHook): Builder + + on_set: function(self: Builder, on_set: function(Entity, Fragment, ? Component, ? Component)): Builder + on_assign: function(self: Builder, on_assign: function(Entity, Fragment, ? Component, ? Component)): Builder + on_insert: function(self: Builder, on_insert: function(Entity, Fragment, ? Component)): Builder + on_remove: function(self: Builder, on_remove: function(Entity, Fragment, ? Component)): Builder + group: function(self: Builder, group: System): Builder + query: function(self: Builder, query: Query): Builder - execute: function(self: Builder, execute: Execute): Builder - prologue: function(self: Builder, prologue: Prologue): Builder - epilogue: function(self: Builder, epilogue: Epilogue): Builder - destruction_policy: function(self: Builder, policy: ID): Builder + execute: function(self: Builder, execute: function(Chunk, {Entity}, integer)): Builder + + prologue: function(self: Builder, prologue: function()): Builder + epilogue: function(self: Builder, epilogue: function()): Builder + + destruction_policy: function(self: Builder, destruction_policy: Id): Builder end TAG: Fragment @@ -112,24 +117,24 @@ local record Evolved EPILOGUE: Fragment DESTRUCTION_POLICY: Fragment - DESTRUCTION_POLICY_DESTROY_ENTITY: ID - DESTRUCTION_POLICY_REMOVE_FRAGMENT: ID + DESTRUCTION_POLICY_DESTROY_ENTITY: Id + DESTRUCTION_POLICY_REMOVE_FRAGMENT: Id - id: function(count?: integer): ID... - name: function(...: ID): string... + id: function(count?: integer): Id... + name: function(...: Id): string... - pack: function(primary: integer, secondary: integer): ID - unpack: function(id: ID): (integer, integer) + pack: function(primary: integer, secondary: integer): Id + unpack: function(id: Id): integer, integer defer: function(): boolean commit: function(): boolean cancel: function(): boolean - spawn: function(components?: { Fragment: Component }): Entity - multi_spawn: function(entity_count: integer, components?: { Fragment: Component }): ({ Entity }, integer) + spawn: function(components?: { Fragment: any }): Entity + multi_spawn: function(entity_count: integer, components?: { Fragment: any }): { Entity }, integer - clone: function(prefab: Entity, components?: { Fragment: Component }): Entity - multi_clone: function(entity_count: integer, prefab: Entity, components?: { Fragment: Component }): ({ Entity }, integer) + clone: function(prefab: Entity, components?: { Fragment: any }): Entity + multi_clone: function(entity_count: integer, prefab: Entity, components?: { Fragment: any }): { Entity }, integer alive: function(entity: Entity): boolean alive_all: function(...: Entity): boolean @@ -143,26 +148,33 @@ local record Evolved has_all: function(entity: Entity, ...: Fragment): boolean has_any: function(entity: Entity, ...: Fragment): boolean - get: function(entity: Entity, ...: Fragment): Component... - set: function(entity: Entity, fragment: Fragment, component?: T) + get: function(entity: Entity) + get: function(entity: Entity, f1: Fragment): C1 | nil + get: function(entity: Entity, f1: Fragment, f2: Fragment): C1 | nil, C2 | nil + get: function(entity: Entity, f1: Fragment, f2: Fragment, f3: Fragment): C1 | nil, C2 | nil, C3 | nil + get: function(entity: Entity, f1: Fragment, f2: Fragment, f3: Fragment, f4: Fragment): C1 | nil, C2 | nil, C3 | nil, C4 | nil + + set: function(entity: Entity, fragment: Fragment, component?: Component) remove: function(entity: Entity, ...: Fragment) clear: function(...: Entity) destroy: function(...: Entity) - batch_set: function(query: Query, fragment: Fragment, component?: T) + batch_set: function(query: Query, fragment: Fragment, component?: Component) batch_remove: function(query: Query, ...: Fragment) batch_clear: function(...: Query) batch_destroy: function(...: Query) - each: function(entity: Entity): (EachIterator, EachState) - execute: function(query: Query): (ExecuteIterator, ExecuteState) - locate: function(entity: Entity): (Chunk, integer) + each: function(entity: Entity): EachIterator, EachState | nil + execute: function(query: Query): ExecuteIterator, ExecuteState | nil + + locate: function(entity: Entity): Chunk | nil, integer process: function(...: System) + debug_mode: function(yesno: boolean) collect_garbage: function() - chunk: function(fragment: Fragment, ...: Fragment): (Chunk, { Entity }, integer) + chunk: function(fragment: Fragment, ...: Fragment): Chunk, { Entity }, integer builder: function(): Builder end diff --git a/evolved.lua b/evolved.lua index 6dd36ce..3da0574 100644 --- a/evolved.lua +++ b/evolved.lua @@ -52,7 +52,7 @@ local evolved = { --- entity: evolved.entity, --- fragment: evolved.fragment, --- new_component: evolved.component, ---- old_component?: evolved.component) +--- old_component: evolved.component) ---@alias evolved.assign_hook fun( --- entity: evolved.entity, @@ -68,7 +68,7 @@ local evolved = { ---@alias evolved.remove_hook fun( --- entity: evolved.entity, --- fragment: evolved.fragment, ---- component: evolved.component) +--- old_component: evolved.component) ---@class (exact) evolved.each_state ---@field package [1] integer structural_changes @@ -6183,7 +6183,7 @@ function __builder_mt:internal() return self:set(__INTERNAL) end ----@param default evolved.component +---@param default evolved.default ---@return evolved.builder builder function __builder_mt:default(default) return self:set(__DEFAULT, default)