diff --git a/worldeditadditions/init.lua b/worldeditadditions/init.lua index f411071..08c03e0 100644 --- a/worldeditadditions/init.lua +++ b/worldeditadditions/init.lua @@ -12,11 +12,11 @@ dofile(worldeditadditions.modpath.."/utils/vector.lua") dofile(worldeditadditions.modpath.."/utils/strings/init.lua") dofile(worldeditadditions.modpath.."/utils/format/init.lua") dofile(worldeditadditions.modpath.."/utils/parse/init.lua") +dofile(worldeditadditions.modpath.."/utils/tables/init.lua") dofile(worldeditadditions.modpath.."/utils/numbers.lua") dofile(worldeditadditions.modpath.."/utils/nodes.lua") dofile(worldeditadditions.modpath.."/utils/node_identification.lua") -dofile(worldeditadditions.modpath.."/utils/tables.lua") dofile(worldeditadditions.modpath.."/utils/terrain.lua") dofile(worldeditadditions.modpath.."/utils/raycast_adv.lua") -- For the farwand dofile(worldeditadditions.modpath.."/utils/axes.lua") diff --git a/worldeditadditions/utils/tables.lua b/worldeditadditions/utils/tables.lua deleted file mode 100644 index 42272f2..0000000 --- a/worldeditadditions/utils/tables.lua +++ /dev/null @@ -1,120 +0,0 @@ ---- Shallow clones a table. --- @source http://lua-users.org/wiki/CopyTable --- @param orig table The table to clone. --- @return table The cloned table. -function worldeditadditions.shallowcopy(orig) - local orig_type = type(orig) - local copy - if orig_type == 'table' then - copy = {} - for orig_key, orig_value in pairs(orig) do - copy[orig_key] = orig_value - end - else -- number, string, boolean, etc - copy = orig - end - return copy -end - ---- SHALLOW ONLY - applies the values in source to overwrite the equivalent keys in target. --- Warning: This function mutates target! --- @param source table The source to take values from --- @param target table The target to write values to -function worldeditadditions.table_apply(source, target) - for key, value in pairs(source) do - target[key] = value - end -end - ---- Polyfill for unpack / table.unpack. --- Calls unpack when available, and looks for table.unpack if unpack() isn't --- found. --- This is needed because in Lua 5.1 it's the global unpack(), but in Lua 5.4 --- it's moved to table.unpack(). -function worldeditadditions.table_unpack(tbl, offset, count) - if type(unpack) == "function" then - return unpack(tbl, offset, count) - else - return table.unpack(tbl, offset, count) - end -end - ---- Returns only the last count items in a given numerical table-based list. -function worldeditadditions.table_get_last(tbl, count) - return {worldeditadditions.table_unpack( - tbl, - math.max(0, (#tbl) - (count - 1)) - )} -end - ---- Returns the key value pairs in a table as a single string --- @param tbl table input table --- @param sep string key value seperator --- @param new_line string key value pair delimiter --- @return string concatenated table pairs -function worldeditadditions.table_tostring(tbl, sep, new_line) - if type(sep) ~= "string" then sep = ": " end - if type(new_line) ~= "string" then new_line = ", " end - local ret = {} - if type(tbl) ~= "table" then return "Error: input not table!" end - for key,value in pairs(tbl) do - ret:append(key) - ret:append(sep) - ret:append(value) - ret:append(new_line) - end - return ret:concat("") -end - ---- Executes the given function on every item in the given table. --- Ignores return values that are nil and doesn't insert them into the table. --- @param tbl table The table to operate on. --- @param func function:any|nil The function to execute on every item in the table. --- @returns table A new table containing the return values of the function. -function worldeditadditions.table_map(tbl, func) - local result = {} - for i,value in ipairs(tbl) do - local newval = func(value, i) - if newval ~= nil then table.insert(result, newval) end - end - return result -end - ---- Filters the items in the given table using the given function. --- The function is executed for each item in the list. If it returns true, the --- item is kept. If it returns false, the item is discarded. --- Arguments passed to the function: item, i --- ...where item is the item to filter, and i is the index in the table the item --- is located at. --- @param tbl table The table of values to filter. --- @param func function:bool The filter function to execute - should return a boolean value indicating whether the item provided as the first argument should be kept --- @returns table A new table containing the values that the given function returned true for. -function worldeditadditions.table_filter(tbl, func) - local result = {} - for i,value in ipairs(tbl) do - if func(value, i) then - table.insert(result, value) - end - end - return result -end - ---- Builds a new table with the elements of the given table appearing at most once. --- @param tbl table The table of values to make unique. --- @returns table A new table containing the values of the given table appearing at most once. -function worldeditadditions.table_unique(tbl) - local newtbl = {} - for i,value in ipairs(tbl) do - local seen = false - for j,seenvalue in ipairs(newtbl) do - if value == seenvalue then - seen = true - break - end - end - if not seen then - table.insert(newtbl, value) - end - end - return newtbl -end diff --git a/worldeditadditions/utils/tables/init.lua b/worldeditadditions/utils/tables/init.lua new file mode 100644 index 0000000..9a9dd1c --- /dev/null +++ b/worldeditadditions/utils/tables/init.lua @@ -0,0 +1,20 @@ +-- ████████ █████ ██████ ██ ███████ ███████ +-- ██ ██ ██ ██ ██ ██ ██ ██ +-- ██ ███████ ██████ ██ █████ ███████ +-- ██ ██ ██ ██ ██ ██ ██ ██ +-- ██ ██ ██ ██████ ███████ ███████ ███████ + +-- Functions that operate on tables. +-- Lua doesn't exactly come with batteries included, so this is quite an +-- extensive collection of functions :P + +-- TODO: Refactor into its own worldeditadditions.tables namespace. + +dofile(worldeditadditions.modpath.."/utils/tables/shallowcopy.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_apply.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_unpack.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_get_last.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_tostring.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_map.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_filter.lua") +dofile(worldeditadditions.modpath.."/utils/tables/table_unique.lua") diff --git a/worldeditadditions/utils/tables/shallowcopy.lua b/worldeditadditions/utils/tables/shallowcopy.lua new file mode 100644 index 0000000..d650b25 --- /dev/null +++ b/worldeditadditions/utils/tables/shallowcopy.lua @@ -0,0 +1,18 @@ + +--- Shallow clones a table. +-- @source http://lua-users.org/wiki/CopyTable +-- @param orig table The table to clone. +-- @return table The cloned table. +function worldeditadditions.shallowcopy(orig) + local orig_type = type(orig) + local copy + if orig_type == 'table' then + copy = {} + for orig_key, orig_value in pairs(orig) do + copy[orig_key] = orig_value + end + else -- number, string, boolean, etc + copy = orig + end + return copy +end diff --git a/worldeditadditions/utils/tables/table_apply.lua b/worldeditadditions/utils/tables/table_apply.lua new file mode 100644 index 0000000..20a1f8b --- /dev/null +++ b/worldeditadditions/utils/tables/table_apply.lua @@ -0,0 +1,9 @@ +--- SHALLOW ONLY - applies the values in source to overwrite the equivalent keys in target. +-- Warning: This function mutates target! +-- @param source table The source to take values from +-- @param target table The target to write values to +function worldeditadditions.table_apply(source, target) + for key, value in pairs(source) do + target[key] = value + end +end diff --git a/worldeditadditions/utils/tables/table_filter.lua b/worldeditadditions/utils/tables/table_filter.lua new file mode 100644 index 0000000..2871b11 --- /dev/null +++ b/worldeditadditions/utils/tables/table_filter.lua @@ -0,0 +1,18 @@ +--- Filters the items in the given table using the given function. +-- The function is executed for each item in the list. If it returns true, the +-- item is kept. If it returns false, the item is discarded. +-- Arguments passed to the function: item, i +-- ...where item is the item to filter, and i is the index in the table the item +-- is located at. +-- @param tbl table The table of values to filter. +-- @param func function:bool The filter function to execute - should return a boolean value indicating whether the item provided as the first argument should be kept +-- @returns table A new table containing the values that the given function returned true for. +function worldeditadditions.table_filter(tbl, func) + local result = {} + for i,value in ipairs(tbl) do + if func(value, i) then + table.insert(result, value) + end + end + return result +end diff --git a/worldeditadditions/utils/tables/table_get_last.lua b/worldeditadditions/utils/tables/table_get_last.lua new file mode 100644 index 0000000..aaf0a49 --- /dev/null +++ b/worldeditadditions/utils/tables/table_get_last.lua @@ -0,0 +1,7 @@ +--- Returns only the last count items in a given numerical table-based list. +function worldeditadditions.table_get_last(tbl, count) + return {worldeditadditions.table_unpack( + tbl, + math.max(0, (#tbl) - (count - 1)) + )} +end diff --git a/worldeditadditions/utils/tables/table_map.lua b/worldeditadditions/utils/tables/table_map.lua new file mode 100644 index 0000000..0a96616 --- /dev/null +++ b/worldeditadditions/utils/tables/table_map.lua @@ -0,0 +1,13 @@ +--- Executes the given function on every item in the given table. +-- Ignores return values that are nil and doesn't insert them into the table. +-- @param tbl table The table to operate on. +-- @param func function:any|nil The function to execute on every item in the table. +-- @returns table A new table containing the return values of the function. +function worldeditadditions.table_map(tbl, func) + local result = {} + for i,value in ipairs(tbl) do + local newval = func(value, i) + if newval ~= nil then table.insert(result, newval) end + end + return result +end diff --git a/worldeditadditions/utils/tables/table_tostring.lua b/worldeditadditions/utils/tables/table_tostring.lua new file mode 100644 index 0000000..2f73816 --- /dev/null +++ b/worldeditadditions/utils/tables/table_tostring.lua @@ -0,0 +1,18 @@ +--- Returns the key value pairs in a table as a single string +-- @param tbl table input table +-- @param sep string key value seperator +-- @param new_line string key value pair delimiter +-- @return string concatenated table pairs +function worldeditadditions.table_tostring(tbl, sep, new_line) + if type(sep) ~= "string" then sep = ": " end + if type(new_line) ~= "string" then new_line = ", " end + local ret = {} + if type(tbl) ~= "table" then return "Error: input not table!" end + for key,value in pairs(tbl) do + ret:append(key) + ret:append(sep) + ret:append(value) + ret:append(new_line) + end + return ret:concat("") +end diff --git a/worldeditadditions/utils/tables/table_unique.lua b/worldeditadditions/utils/tables/table_unique.lua new file mode 100644 index 0000000..4d544c1 --- /dev/null +++ b/worldeditadditions/utils/tables/table_unique.lua @@ -0,0 +1,19 @@ +--- Builds a new table with the elements of the given table appearing at most once. +-- @param tbl table The table of values to make unique. +-- @returns table A new table containing the values of the given table appearing at most once. +function worldeditadditions.table_unique(tbl) + local newtbl = {} + for i,value in ipairs(tbl) do + local seen = false + for j,seenvalue in ipairs(newtbl) do + if value == seenvalue then + seen = true + break + end + end + if not seen then + table.insert(newtbl, value) + end + end + return newtbl +end diff --git a/worldeditadditions/utils/tables/table_unpack.lua b/worldeditadditions/utils/tables/table_unpack.lua new file mode 100644 index 0000000..83ceae0 --- /dev/null +++ b/worldeditadditions/utils/tables/table_unpack.lua @@ -0,0 +1,12 @@ +--- Polyfill for unpack / table.unpack. +-- Calls unpack when available, and looks for table.unpack if unpack() isn't +-- found. +-- This is needed because in Lua 5.1 it's the global unpack(), but in Lua 5.4 +-- it's moved to table.unpack(). +function worldeditadditions.table_unpack(tbl, offset, count) + if type(unpack) == "function" then + return unpack(tbl, offset, count) + else + return table.unpack(tbl, offset, count) + end +end