@@ -120,49 +120,6 @@ local evolved = {
120120---
121121---
122122
123- local __debug_mode = false --- @type boolean
124-
125- local __freelist_ids = {} --- @type integer[]
126- local __acquired_count = 0 --- @type integer
127- local __available_primary = 0 --- @type integer
128-
129- local __defer_depth = 0 --- @type integer
130- local __defer_points = {} --- @type integer[]
131- local __defer_length = 0 --- @type integer
132- local __defer_bytecode = {} --- @type any[]
133-
134- local __root_set = {} --- @type table<evolved.fragment , integer>
135- local __root_list = {} --- @type evolved.chunk[]
136- local __root_count = 0 --- @type integer
137-
138- local __major_chunks = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.chunk>>
139- local __minor_chunks = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.chunk>>
140-
141- local __query_chunks = {} --- @type table<evolved.query , evolved.assoc_list<evolved.chunk>>
142- local __major_queries = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.query>>
143-
144- local __entity_chunks = {} --- @type (evolved.chunk | false )[]
145- local __entity_places = {} --- @type integer[]
146-
147- local __named_entity = {} --- @type table<string , evolved.entity>
148- local __named_entities = {} --- @type table<string , evolved.assoc_list<evolved.entity>>
149-
150- local __sorted_includes = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
151- local __sorted_excludes = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
152- local __sorted_variants = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
153- local __sorted_requires = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.fragment>>
154-
155- local __subsystem_groups = {} --- @type table<evolved.system , evolved.system>
156- local __group_subsystems = {} --- @type table<evolved.system , evolved.assoc_list<evolved.system>>
157-
158- local __structural_changes = 0 --- @type integer
159-
160- ---
161- ---
162- ---
163- ---
164- ---
165-
166123--- @class evolved.chunk
167124--- @field package __parent ? evolved.chunk
168125--- @field package __child_set table<evolved.chunk , integer>
648605---
649606---
650607
608+ local __debug_mode = false --- @type boolean
609+ local __error_handler = __lua_debug_traceback --- @type fun ( message : string ): string
610+
611+ local __freelist_ids = {} --- @type integer[]
612+ local __acquired_count = 0 --- @type integer
613+ local __available_primary = 0 --- @type integer
614+
615+ local __defer_depth = 0 --- @type integer
616+ local __defer_points = {} --- @type integer[]
617+ local __defer_length = 0 --- @type integer
618+ local __defer_bytecode = {} --- @type any[]
619+
620+ local __root_set = {} --- @type table<evolved.fragment , integer>
621+ local __root_list = {} --- @type evolved.chunk[]
622+ local __root_count = 0 --- @type integer
623+
624+ local __major_chunks = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.chunk>>
625+ local __minor_chunks = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.chunk>>
626+
627+ local __query_chunks = {} --- @type table<evolved.query , evolved.assoc_list<evolved.chunk>>
628+ local __major_queries = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.query>>
629+
630+ local __entity_chunks = {} --- @type (evolved.chunk | false )[]
631+ local __entity_places = {} --- @type integer[]
632+
633+ local __named_entity = {} --- @type table<string , evolved.entity>
634+ local __named_entities = {} --- @type table<string , evolved.assoc_list<evolved.entity>>
635+
636+ local __sorted_includes = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
637+ local __sorted_excludes = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
638+ local __sorted_variants = {} --- @type table<evolved.query , evolved.assoc_list<evolved.fragment>>
639+ local __sorted_requires = {} --- @type table<evolved.fragment , evolved.assoc_list<evolved.fragment>>
640+
641+ local __subsystem_groups = {} --- @type table<evolved.system , evolved.system>
642+ local __group_subsystems = {} --- @type table<evolved.system , evolved.assoc_list<evolved.system>>
643+
644+ local __structural_changes = 0 --- @type integer
645+
646+ ---
647+ ---
648+ ---
649+ ---
650+ ---
651+
651652--- @return evolved.id
652653--- @nodiscard
653654local function __acquire_id ()
@@ -1233,6 +1234,7 @@ local __evolved_process
12331234local __evolved_process_with
12341235
12351236local __evolved_debug_mode
1237+ local __evolved_error_handler
12361238local __evolved_collect_garbage
12371239
12381240local __evolved_chunk
@@ -4768,7 +4770,7 @@ local function __system_process(system, ...)
47684770 __QUERY , __EXECUTE , __PROLOGUE , __EPILOGUE )
47694771
47704772 if prologue then
4771- local success , result = __lua_xpcall (prologue , __lua_debug_traceback , ... )
4773+ local success , result = __lua_xpcall (prologue , __error_handler , ... )
47724774
47734775 if not success then
47744776 __error_fmt (' system prologue failed: %s' , result )
@@ -4778,7 +4780,7 @@ local function __system_process(system, ...)
47784780 if execute then
47794781 __evolved_defer ()
47804782 do
4781- local success , result = __lua_xpcall (__query_execute , __lua_debug_traceback , query or system , execute , ... )
4783+ local success , result = __lua_xpcall (__query_execute , __error_handler , query or system , execute , ... )
47824784
47834785 if not success then
47844786 __evolved_cancel ()
@@ -4814,7 +4816,7 @@ local function __system_process(system, ...)
48144816 end
48154817
48164818 if epilogue then
4817- local success , result = __lua_xpcall (epilogue , __lua_debug_traceback , ... )
4819+ local success , result = __lua_xpcall (epilogue , __error_handler , ... )
48184820
48194821 if not success then
48204822 __error_fmt (' system epilogue failed: %s' , result )
@@ -6413,6 +6415,11 @@ function __evolved_debug_mode(yesno)
64136415 __debug_mode = yesno
64146416end
64156417
6418+ --- @param handler ? fun ( message : string ): string
6419+ function __evolved_error_handler (handler )
6420+ __error_handler = handler or __lua_debug_traceback
6421+ end
6422+
64166423--- @param no_shrink boolean ?
64176424function __evolved_collect_garbage (no_shrink )
64186425 if __defer_depth > 0 then
@@ -7601,8 +7608,10 @@ end)
76017608---
76027609---
76037610
7611+ local __query_hook_fns = {}
7612+
76047613--- @param query evolved.query
7605- local function __insert_query (query )
7614+ function __query_hook_fns . insert_query (query )
76067615 local query_includes = __sorted_includes [query ]
76077616 local query_include_list = query_includes and query_includes .__item_list
76087617 local query_include_count = query_includes and query_includes .__item_count or 0
@@ -7642,7 +7651,7 @@ local function __insert_query(query)
76427651end
76437652
76447653--- @param query evolved.query
7645- local function __remove_query (query )
7654+ function __query_hook_fns . remove_query (query )
76467655 local query_includes = __sorted_includes [query ]
76477656 local query_include_list = query_includes and query_includes .__item_list
76487657 local query_include_count = query_includes and query_includes .__item_count or 0
@@ -7684,7 +7693,7 @@ end
76847693--- @param query evolved.query
76857694--- @param include_list evolved.fragment[]
76867695__evolved_set (__INCLUDES , __ON_SET , function (query , _ , include_list )
7687- __remove_query (query )
7696+ __query_hook_fns . remove_query (query )
76887697
76897698 local include_count = # include_list
76907699
@@ -7700,16 +7709,16 @@ __evolved_set(__INCLUDES, __ON_SET, function(query, _, include_list)
77007709 __sorted_includes [query ] = nil
77017710 end
77027711
7703- __insert_query (query )
7712+ __query_hook_fns . insert_query (query )
77047713 __update_major_chunks (query )
77057714end )
77067715
77077716__evolved_set (__INCLUDES , __ON_REMOVE , function (query )
7708- __remove_query (query )
7717+ __query_hook_fns . remove_query (query )
77097718
77107719 __sorted_includes [query ] = nil
77117720
7712- __insert_query (query )
7721+ __query_hook_fns . insert_query (query )
77137722 __update_major_chunks (query )
77147723end )
77157724
@@ -7722,7 +7731,7 @@ end)
77227731--- @param query evolved.query
77237732--- @param exclude_list evolved.fragment[]
77247733__evolved_set (__EXCLUDES , __ON_SET , function (query , _ , exclude_list )
7725- __remove_query (query )
7734+ __query_hook_fns . remove_query (query )
77267735
77277736 local exclude_count = # exclude_list
77287737
@@ -7738,16 +7747,16 @@ __evolved_set(__EXCLUDES, __ON_SET, function(query, _, exclude_list)
77387747 __sorted_excludes [query ] = nil
77397748 end
77407749
7741- __insert_query (query )
7750+ __query_hook_fns . insert_query (query )
77427751 __update_major_chunks (query )
77437752end )
77447753
77457754__evolved_set (__EXCLUDES , __ON_REMOVE , function (query )
7746- __remove_query (query )
7755+ __query_hook_fns . remove_query (query )
77477756
77487757 __sorted_excludes [query ] = nil
77497758
7750- __insert_query (query )
7759+ __query_hook_fns . insert_query (query )
77517760 __update_major_chunks (query )
77527761end )
77537762
@@ -7760,7 +7769,7 @@ end)
77607769--- @param query evolved.query
77617770--- @param variant_list evolved.fragment[]
77627771__evolved_set (__VARIANTS , __ON_SET , function (query , _ , variant_list )
7763- __remove_query (query )
7772+ __query_hook_fns . remove_query (query )
77647773
77657774 local variant_count = # variant_list
77667775
@@ -7776,16 +7785,16 @@ __evolved_set(__VARIANTS, __ON_SET, function(query, _, variant_list)
77767785 __sorted_variants [query ] = nil
77777786 end
77787787
7779- __insert_query (query )
7788+ __query_hook_fns . insert_query (query )
77807789 __update_major_chunks (query )
77817790end )
77827791
77837792__evolved_set (__VARIANTS , __ON_REMOVE , function (query )
7784- __remove_query (query )
7793+ __query_hook_fns . remove_query (query )
77857794
77867795 __sorted_variants [query ] = nil
77877796
7788- __insert_query (query )
7797+ __query_hook_fns . insert_query (query )
77897798 __update_major_chunks (query )
77907799end )
77917800
@@ -7826,8 +7835,10 @@ end)
78267835---
78277836---
78287837
7838+ local __group_hook_fns = {}
7839+
78297840--- @param subsystem evolved.system
7830- local function __add_subsystem (subsystem )
7841+ function __group_hook_fns . add_subsystem (subsystem )
78317842 local subsystem_group = __subsystem_groups [subsystem ]
78327843
78337844 if subsystem_group then
@@ -7844,7 +7855,7 @@ local function __add_subsystem(subsystem)
78447855end
78457856
78467857--- @param subsystem evolved.system
7847- local function __remove_subsystem (subsystem )
7858+ function __group_hook_fns . remove_subsystem (subsystem )
78487859 local subsystem_group = __subsystem_groups [subsystem ]
78497860
78507861 if subsystem_group then
@@ -7856,23 +7867,29 @@ local function __remove_subsystem(subsystem)
78567867 end
78577868end
78587869
7870+ ---
7871+ ---
7872+ ---
7873+ ---
7874+ ---
7875+
78597876--- @param system evolved.system
78607877__evolved_set (__GROUP , __ON_SET , function (system , _ , group )
7861- __remove_subsystem (system )
7878+ __group_hook_fns . remove_subsystem (system )
78627879
78637880 __subsystem_groups [system ] = group
78647881
7865- __add_subsystem (system )
7882+ __group_hook_fns . add_subsystem (system )
78667883 __update_major_chunks (system )
78677884end )
78687885
78697886--- @param system evolved.system
78707887__evolved_set (__GROUP , __ON_REMOVE , function (system )
7871- __remove_subsystem (system )
7888+ __group_hook_fns . remove_subsystem (system )
78727889
78737890 __subsystem_groups [system ] = nil
78747891
7875- __add_subsystem (system )
7892+ __group_hook_fns . add_subsystem (system )
78767893 __update_major_chunks (system )
78777894end )
78787895
@@ -7984,6 +8001,7 @@ evolved.process = __evolved_process
79848001evolved .process_with = __evolved_process_with
79858002
79868003evolved .debug_mode = __evolved_debug_mode
8004+ evolved .error_handler = __evolved_error_handler
79878005evolved .collect_garbage = __evolved_collect_garbage
79888006
79898007evolved .chunk = __evolved_chunk
0 commit comments