summaryrefslogtreecommitdiff
path: root/scripts/granger/lib/table.lua
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/granger/lib/table.lua')
-rw-r--r--scripts/granger/lib/table.lua181
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