summaryrefslogtreecommitdiff
path: root/macros/luatex/latex/luacas/tex/_lib/table.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/latex/luacas/tex/_lib/table.lua')
-rw-r--r--macros/luatex/latex/luacas/tex/_lib/table.lua185
1 files changed, 185 insertions, 0 deletions
diff --git a/macros/luatex/latex/luacas/tex/_lib/table.lua b/macros/luatex/latex/luacas/tex/_lib/table.lua
new file mode 100644
index 0000000000..70495d1479
--- /dev/null
+++ b/macros/luatex/latex/luacas/tex/_lib/table.lua
@@ -0,0 +1,185 @@
+-- Checks if two arrays are equal, starting at index i
+function ArrayEqual(a1, a2, i)
+ i = i or 1
+ while i <= math.max(#a1, #a2) do
+ if a1[i] ~= a2[i] then
+ return false
+ end
+ i = i + 1
+ end
+ return true
+end
+
+-- Checks if two arrays are equal, the first starting at index i, the second starting at index j
+function FancyArrayEqual(a1, a2, i, j)
+ i = i or 1
+ j = j or 1
+ while i <= math.max(#a1, #a2) or j <= math.max(#a1, #a2) do
+ if a1[i] ~= a2[j] then
+ return false
+ end
+ i = i + 1
+ j = j + 1
+ end
+ return true
+end
+
+-- Creates a copy of a table
+function Copy(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
+ copy = setmetatable(copy, getmetatable(orig))
+ else -- number, string, boolean, etc
+ copy = orig
+ end
+ return copy
+end
+
+-- Joins two arrays
+function JoinArrays(a1, a2)
+ local a = Copy(a1)
+ for index, value in ipairs(a2) do
+ a[index + #a1] = value
+ end
+ return a
+end
+
+-- Joins two arrays indexed from zero
+function JoinZeroArrays(a1, a2)
+ local a = Copy(a1)
+ a[#a1 + 1] = a2[0]
+ for index, value in ipairs(a2) do
+ a[index + #a1 + 1] = value
+ end
+ return a
+end
+
+-- Join two tables, using the second entry if a key appears in both tables
+function JoinTables(t1, t2)
+ local t = Copy(t1) or {}
+ for key, value in pairs(t2) do
+ t[key] = value
+ end
+ return t
+end
+
+-- Given an array, removes all occurances of that element from the array
+function Remove(a, e)
+ local r = Copy(a)
+ local found = false
+ for index, value in ipairs(r) do
+ if e == value then
+ found = true
+ end
+ if found then
+ r[index] = r[index + 1]
+ end
+ end
+ return r
+end
+
+-- Given an array, removes all elements in the second array from the first
+function RemoveAll(a1, a2)
+ local r = Copy(a1)
+ local removed = 0
+ for index, value in ipairs(r) do
+ if a2[value] then
+ removed = removed + 1
+ end
+ if removed then
+ r[index] = r[index + removed]
+ end
+ end
+ return r
+end
+
+-- Given an array of arrays, returns only the arrays that have no elements in common with the second array
+function RemoveAny(aa, a)
+ local toremove = {}
+ for _, v in ipairs(aa) do
+ for _, v1 in ipairs(v) do
+ for _, v2 in ipairs(a) do
+ if v1 == v2 then
+ toremove[#toremove+1] = v
+ goto endcheck
+ end
+ end
+ end
+ ::endcheck::
+ end
+ return RemoveAll(aa, toremove)
+end
+
+-- Converts an array to a string recursively
+function ToStringArray(t)
+ if string.sub(tostring(t), 1, 6) == "table:" then
+ local out = "{"
+ for index, value in ipairs(t) do
+ out = out .. ToStringArray(value)
+ if t[index + 1] then
+ out = out .. ", "
+ end
+ end
+ return out .. "}"
+ end
+ return tostring(t)
+end
+
+-- Converts a table to a string recursively
+function ToStringTable(t)
+ if string.sub(tostring(t), 1, 6) == "table:" then
+ local out = "{"
+ for index, value in pairs(t) do
+ out = out .. ToStringTable(index) .. " : " .. ToStringTable(value)
+ if t[index + 1] then
+ out = out .. ", "
+ end
+ end
+ return out .. "}"
+ end
+ return tostring(t)
+end
+
+-- Check if a table contains an element, and returns the index of that element if it does
+function Contains(t, e)
+ for index, value in pairs(t) do
+ if value == e then
+ return index
+ end
+ end
+ return false
+end
+
+-- Given an array a of unique elements, returns an array of the n-element subarrays of a
+function Subarrays(a, m)
+ local aout = {}
+ local l = 1
+ local newmax = {}
+
+ if(m <= 0) then
+ return {{}}, {0}
+ end
+
+ local rec, max = Subarrays(a, m - 1)
+
+ for recindex, set in pairs(rec) do
+ for index, element in pairs(a) do
+ if not set[element] and index > max[recindex] then
+ local new = Copy(set)
+ new[#new+1] = element
+ aout[l] = new
+ if not newmax[l] or index > newmax[l] then
+ newmax[l] = index
+ end
+ l = l + 1
+ end
+ end
+ end
+
+ return aout, newmax
+end \ No newline at end of file