mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-14 12:10:23 +07:00
after/before fragments, after/before system_builder methods
This commit is contained in:
10
README.md
10
README.md
@@ -33,6 +33,14 @@ ON_SET :: fragment
|
||||
ON_ASSIGN :: fragment
|
||||
ON_INSERT :: fragment
|
||||
ON_REMOVE :: fragment
|
||||
|
||||
AFTER :: fragment
|
||||
BEFORE :: fragment
|
||||
|
||||
PHASE :: fragment
|
||||
QUERY :: fragment
|
||||
PROCESS :: fragment
|
||||
EXECUTE :: fragment
|
||||
```
|
||||
|
||||
## Functions
|
||||
@@ -123,6 +131,8 @@ phase_builder:build :: phase, boolean
|
||||
|
||||
```
|
||||
system :: system_builder
|
||||
system_builder:after :: system... -> system_builder
|
||||
system_builder:before :: system... -> system_builder
|
||||
system_builder:phase :: phase -> system_builder
|
||||
system_builder:query :: query -> system_builder
|
||||
system_builder:process :: {} -> system_builder
|
||||
|
||||
@@ -6526,3 +6526,29 @@ do
|
||||
assert(evo.has(f, f) and evo.get(f, f) == 42)
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local s1 = evo.system():build()
|
||||
do
|
||||
local after = evo.get(s1, evo.AFTER)
|
||||
local before = evo.get(s1, evo.BEFORE)
|
||||
assert(after == nil)
|
||||
assert(before == nil)
|
||||
end
|
||||
|
||||
local s2 = evo.system():after(s1):build()
|
||||
do
|
||||
local after = evo.get(s2, evo.AFTER)
|
||||
local before = evo.get(s2, evo.BEFORE)
|
||||
assert(#after == 1 and after[1] == s1)
|
||||
assert(before == nil)
|
||||
end
|
||||
|
||||
local s0 = evo.system():before(s1, s2):build()
|
||||
do
|
||||
local after = evo.get(s0, evo.AFTER)
|
||||
local before = evo.get(s0, evo.BEFORE)
|
||||
assert(after == nil)
|
||||
assert(#before == 2 and before[1] == s1 and before[2] == s2)
|
||||
end
|
||||
end
|
||||
|
||||
203
evolved.lua
203
evolved.lua
@@ -106,6 +106,9 @@ local __entity_places = {} ---@type table<integer, integer>
|
||||
|
||||
local __structural_changes = 0 ---@type integer
|
||||
|
||||
local __system_after_sets = {} ---@type table<evolved.system, table<evolved.system, boolean>>
|
||||
local __system_before_sets = {} ---@type table<evolved.system, table<evolved.system, boolean>>
|
||||
|
||||
---
|
||||
---
|
||||
---
|
||||
@@ -396,6 +399,7 @@ end
|
||||
---
|
||||
|
||||
evolved.TAG = __acquire_id()
|
||||
|
||||
evolved.DEFAULT = __acquire_id()
|
||||
evolved.CONSTRUCT = __acquire_id()
|
||||
|
||||
@@ -407,6 +411,9 @@ evolved.ON_ASSIGN = __acquire_id()
|
||||
evolved.ON_INSERT = __acquire_id()
|
||||
evolved.ON_REMOVE = __acquire_id()
|
||||
|
||||
evolved.AFTER = __acquire_id()
|
||||
evolved.BEFORE = __acquire_id()
|
||||
|
||||
evolved.PHASE = __acquire_id()
|
||||
evolved.QUERY = __acquire_id()
|
||||
evolved.PROCESS = __acquire_id()
|
||||
@@ -6029,6 +6036,8 @@ end
|
||||
---
|
||||
|
||||
---@class (exact) evolved.__system_builder
|
||||
---@field package __after? evolved.system[]
|
||||
---@field package __before? evolved.system[]
|
||||
---@field package __phase? evolved.phase
|
||||
---@field package __query? evolved.query
|
||||
---@field package __process? evolved.process
|
||||
@@ -6043,6 +6052,8 @@ evolved_system_builder.__index = evolved_system_builder
|
||||
function evolved.system()
|
||||
---@type evolved.__system_builder
|
||||
local builder = {
|
||||
__after = nil,
|
||||
__before = nil,
|
||||
__phase = nil,
|
||||
__query = nil,
|
||||
__process = nil,
|
||||
@@ -6052,6 +6063,58 @@ function evolved.system()
|
||||
return setmetatable(builder, evolved_system_builder)
|
||||
end
|
||||
|
||||
---@param ... evolved.system systems
|
||||
---@return evolved.system_builder builder
|
||||
function evolved_system_builder:after(...)
|
||||
local system_count = select('#', ...)
|
||||
|
||||
if system_count == 0 then
|
||||
return self
|
||||
end
|
||||
|
||||
local after = self.__after
|
||||
|
||||
if not after then
|
||||
after = __table_new(math.max(4, system_count), 0)
|
||||
self.__after = after
|
||||
end
|
||||
|
||||
local after_count = #after
|
||||
|
||||
for i = 1, system_count do
|
||||
after_count = after_count + 1
|
||||
after[after_count] = select(i, ...)
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
---@param ... evolved.system systems
|
||||
---@return evolved.system_builder builder
|
||||
function evolved_system_builder:before(...)
|
||||
local system_count = select('#', ...)
|
||||
|
||||
if system_count == 0 then
|
||||
return self
|
||||
end
|
||||
|
||||
local before = self.__before
|
||||
|
||||
if not before then
|
||||
before = __table_new(math.max(4, system_count), 0)
|
||||
self.__before = before
|
||||
end
|
||||
|
||||
local before_count = #before
|
||||
|
||||
for i = 1, system_count do
|
||||
before_count = before_count + 1
|
||||
before[before_count] = select(i, ...)
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
---@param phase evolved.phase
|
||||
function evolved_system_builder:phase(phase)
|
||||
self.__phase = phase
|
||||
@@ -6079,11 +6142,15 @@ end
|
||||
---@return evolved.system system
|
||||
---@return boolean is_deferred
|
||||
function evolved_system_builder:build()
|
||||
local after = self.__after
|
||||
local before = self.__before
|
||||
local phase = self.__phase
|
||||
local query = self.__query
|
||||
local process = self.__process
|
||||
local execute = self.__execute
|
||||
|
||||
self.__after = nil
|
||||
self.__before = nil
|
||||
self.__phase = nil
|
||||
self.__query = nil
|
||||
self.__process = nil
|
||||
@@ -6093,6 +6160,18 @@ function evolved_system_builder:build()
|
||||
local component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST)
|
||||
local component_count = 0
|
||||
|
||||
if after then
|
||||
component_count = component_count + 1
|
||||
fragment_list[component_count] = evolved.AFTER
|
||||
component_list[component_count] = after
|
||||
end
|
||||
|
||||
if before then
|
||||
component_count = component_count + 1
|
||||
fragment_list[component_count] = evolved.BEFORE
|
||||
component_list[component_count] = before
|
||||
end
|
||||
|
||||
if phase then
|
||||
component_count = component_count + 1
|
||||
fragment_list[component_count] = evolved.PHASE
|
||||
@@ -6369,4 +6448,128 @@ end))
|
||||
---
|
||||
---
|
||||
|
||||
---@param ... evolved.system
|
||||
assert(evolved.insert(evolved.AFTER, evolved.CONSTRUCT, function(...)
|
||||
local system_count = select('#', ...)
|
||||
|
||||
if system_count == 0 then
|
||||
return {}
|
||||
end
|
||||
|
||||
---@type evolved.system[]
|
||||
local after_list = __table_new(system_count, 0)
|
||||
|
||||
for i = 1, system_count do
|
||||
after_list[i] = select(i, ...)
|
||||
end
|
||||
|
||||
return after_list
|
||||
end))
|
||||
|
||||
---@param system evolved.system
|
||||
---@param new_after_list evolved.system[]
|
||||
---@param old_after_list? evolved.system[]
|
||||
assert(evolved.insert(evolved.AFTER, evolved.ON_SET, function(system, _, new_after_list, old_after_list)
|
||||
if old_after_list then
|
||||
for i = 1, #old_after_list do
|
||||
local old_after = old_after_list[i]
|
||||
__system_before_sets[old_after][system] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local new_after_set = {}
|
||||
__system_after_sets[system] = new_after_set
|
||||
|
||||
for i = 1, #new_after_list do
|
||||
local new_after = new_after_list[i]
|
||||
new_after_set[new_after] = true
|
||||
|
||||
local new_after_before_set = __system_before_sets[new_after]
|
||||
|
||||
if not new_after_before_set then
|
||||
new_after_before_set = {}
|
||||
__system_before_sets[new_after] = new_after_before_set
|
||||
end
|
||||
|
||||
new_after_before_set[system] = true
|
||||
end
|
||||
end))
|
||||
|
||||
---@param system evolved.system
|
||||
---@param old_after_list evolved.system[]
|
||||
assert(evolved.insert(evolved.AFTER, evolved.ON_REMOVE, function(system, _, old_after_list)
|
||||
for i = 1, #old_after_list do
|
||||
local old_after = old_after_list[i]
|
||||
__system_before_sets[old_after][system] = nil
|
||||
end
|
||||
|
||||
local new_after_set = nil
|
||||
__system_after_sets[system] = new_after_set
|
||||
end))
|
||||
|
||||
---@param ... evolved.system
|
||||
assert(evolved.insert(evolved.BEFORE, evolved.CONSTRUCT, function(...)
|
||||
local system_count = select('#', ...)
|
||||
|
||||
if system_count == 0 then
|
||||
return {}
|
||||
end
|
||||
|
||||
---@type evolved.system[]
|
||||
local before_list = __table_new(system_count, 0)
|
||||
|
||||
for i = 1, system_count do
|
||||
before_list[i] = select(i, ...)
|
||||
end
|
||||
|
||||
return before_list
|
||||
end))
|
||||
|
||||
---@param system evolved.system
|
||||
---@param new_before_list evolved.system[]
|
||||
---@param old_before_list? evolved.system[]
|
||||
assert(evolved.insert(evolved.BEFORE, evolved.ON_SET, function(system, _, new_before_list, old_before_list)
|
||||
if old_before_list then
|
||||
for i = 1, #old_before_list do
|
||||
local old_before = old_before_list[i]
|
||||
__system_after_sets[old_before][system] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local new_before_set = {}
|
||||
__system_before_sets[system] = new_before_set
|
||||
|
||||
for i = 1, #new_before_list do
|
||||
local new_before = new_before_list[i]
|
||||
new_before_set[new_before] = true
|
||||
|
||||
local new_before_after_set = __system_after_sets[new_before]
|
||||
|
||||
if not new_before_after_set then
|
||||
new_before_after_set = {}
|
||||
__system_after_sets[new_before] = new_before_after_set
|
||||
end
|
||||
|
||||
new_before_after_set[system] = true
|
||||
end
|
||||
end))
|
||||
|
||||
---@param system evolved.system
|
||||
---@param old_before_list evolved.system[]
|
||||
assert(evolved.insert(evolved.BEFORE, evolved.ON_REMOVE, function(system, _, old_before_list)
|
||||
for i = 1, #old_before_list do
|
||||
local old_before = old_before_list[i]
|
||||
__system_after_sets[old_before][system] = nil
|
||||
end
|
||||
|
||||
local new_before_set = nil
|
||||
__system_before_sets[system] = new_before_set
|
||||
end))
|
||||
|
||||
---
|
||||
---
|
||||
---
|
||||
---
|
||||
---
|
||||
|
||||
return evolved
|
||||
|
||||
Reference in New Issue
Block a user