diff options
Diffstat (limited to 'scripts/granger/lib/table.lua')
-rw-r--r-- | scripts/granger/lib/table.lua | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/scripts/granger/lib/table.lua b/scripts/granger/lib/table.lua new file mode 100644 index 0000000..3076cb0 --- /dev/null +++ b/scripts/granger/lib/table.lua @@ -0,0 +1,181 @@ +-- +-- table.lua +-- Additions to Lua's built-in table functions. +-- Copyright (c) 2002-2008 Jason Perkins and the Premake project +-- + + +-- +-- Returns true if the table contains the specified value. +-- + + function table.contains(t, value) + for _,v in pairs(t) do + if (v == value) then + return true + end + end + return false + end + + +-- +-- Enumerates an array of objects and returns a new table containing +-- only the value of one particular field. +-- + + function table.extract(arr, fname) + local result = { } + for _,v in ipairs(arr) do + table.insert(result, v[fname]) + end + return result + end + + + +-- +-- Flattens a hierarchy of tables into a single array containing all +-- of the values. +-- + + function table.flatten(arr) + local result = { } + + local function flatten(arr) + for _, v in ipairs(arr) do + if type(v) == "table" then + flatten(v) + else + table.insert(result, v) + end + end + end + + flatten(arr) + return result + end + + +-- +-- Merges an array of items into a string. +-- + + function table.implode(arr, before, after, between) + local result = "" + for _,v in ipairs(arr) do + if (result ~= "" and between) then + result = result .. between + end + result = result .. before .. v .. after + end + return result + end + + +-- +-- Inserts a value of array of values into a table. If the value is +-- itself a table, its contents are enumerated and added instead. So +-- these inputs give these outputs: +-- +-- "x" -> { "x" } +-- { "x", "y" } -> { "x", "y" } +-- { "x", { "y" }} -> { "x", "y" } +-- + + function table.insertflat(tbl, values) + if type(values) == "table" then + for _, value in ipairs(values) do + table.insertflat(tbl, value) + end + else + table.insert(tbl, values) + end + end + + +-- +-- Returns true if the table is empty, and contains no indexed or keyed values. +-- + + function table.isempty(t) + return next(t) == nil + end + + +-- +-- Adds the values from one array to the end of another and +-- returns the result. +-- + + function table.join(...) + local result = { } + for _,t in ipairs(arg) do + if type(t) == "table" then + for _,v in ipairs(t) do + table.insert(result, v) + end + else + table.insert(result, t) + end + end + return result + end + + +-- +-- Return a list of all keys used in a table. +-- + + function table.keys(tbl) + local keys = {} + for k, _ in pairs(tbl) do + table.insert(keys, k) + end + return keys + end + + +-- +-- Adds the key-value associations from one table into another +-- and returns the resulting merged table. +-- + + function table.merge(...) + local result = { } + for _,t in ipairs(arg) do + if type(t) == "table" then + for k,v in pairs(t) do + result[k] = v + end + else + error("invalid value") + end + end + return result + end + + + +-- +-- Translates the values contained in array, using the specified +-- translation table, and returns the results in a new array. +-- + + function table.translate(arr, translation) + local result = { } + for _, value in ipairs(arr) do + local tvalue + if type(translation) == "function" then + tvalue = translation(value) + else + tvalue = translation[value] + end + if (tvalue) then + table.insert(result, tvalue) + end + end + return result + end + +
\ No newline at end of file |