local p = {}
function p.get_key_for_value(t, value)
for k, v in pairs(t) do
if v == value then
return k
end
end
end
function p.merge_tables(t1, t2)
-- merge tables that are key-value: {a=1, b=2} and {c=3, d=4}
local result={}
for k, v in pairs(t1) do
result[k] = v
end
for k, v in pairs(t2) do
result[k] = v
end
return result
end
function p.append_tables(t1, t2)
-- append indexed/keyed table to another
-- indexes/keys gonna lost!
-- the result is table with new indexes
-- also see p.merge_tables()
local result={}
for _, v in pairs(t1) do
table.insert(result, v)
end
for _, v in pairs(t2) do
table.insert(result, v)
end
return result
end
function p.shallowcopy(orig)
-- real-copy of a table
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
function p.tableConcatNil(t, sep)
-- erlaubt auch nils bzw. Lücken im Index
-- mit Strings indizierte Elemente werden ignoriert
-- Default sep ist " "
-- {nil, 2, nil, 4, nil, ["a"]="b"} wird zu "2 4"
local s
if t ~= nil then
s = ""
local first = true
-- höchsten Index ermitteln
local i_max = 0
for i, _ in pairs(t) do
if type(i) == "number" and i > i_max then
i_max = i
end
end
-- alle Indizes durchiterieren
for i = 1, i_max do
if t[i] ~= nil then
if not first then
s = s .. (sep or " ")
end
first = false
s = s .. t[i]
end
end
end
return s
end
function p.tableMultiSeparatorConcat(t)
-- Fügt eine Tabelle mit beliebigen Separatoren zu einem String zusammen.
-- Die Separatoren sind immer die mit ungerader Zahl indizierten
-- Tabellen-Einträge und werden immer nur eingefügt, wenn nötig.
-- Die Werte sind immer die mit gerader Zahl indizierten Tabellen-Einträge.
-- Separator 1 und #t (z. B. Klammern) sind werden am Anfang oder Ende
-- angefügt, sofern mindestens ein Wert Inhalt hat.
-- Konsolenzeile zum Debuggen:
-- =p.tableMultiSeparatorConcat{"(", 1, "a", 2, "b", 3, ")"} -- ergibt (1a2b3)
-- =p.tableMultiSeparatorConcat{nil, 1, "a", 2, "b", 3, ")"} -- ergibt 1a2b3)
-- =p.tableMultiSeparatorConcat{"(", nil, "a", 2, "b", 3, ")"} -- ergibt (2b3)
-- =p.tableMultiSeparatorConcat{"(", 1, nil, 2, "b", 3, ")"} -- ergibt (12b3)
-- =p.tableMultiSeparatorConcat{"(", 1, "a", nil, "b", 3, ")"} -- ergibt (1b3)
-- =p.tableMultiSeparatorConcat{"(", 1, "a", 2, nil, 3, ")"} -- ergibt (1a23)
-- =p.tableMultiSeparatorConcat{"(", 1, "a", 2, "b", nil, ")"} -- ergibt (1a2)
-- =p.tableMultiSeparatorConcat{"(", 1, "a", 2, "b", 3, nil} -- ergibt (1a2b3
-- =p.tableMultiSeparatorConcat{"(", 1, "a", 2, "b", 3} -- ergibt (1a2b3
-- =p.tableMultiSeparatorConcat{"(", nil, "a", nil, "b", nil} -- ergibt nil
local s
for i = 2, #t, 2 do
if t[i] ~= nil then
if s == nil then
s = t[1] or ""
elseif t[i-1] ~= nil then
s = s .. t[i-1]
end
s = s .. t[i]
end
end
if s ~= nil and s ~= "" and #t % 2 == 1 and t[#t] ~= nil then
s = s .. t[#t]
end
return s
end
function p.toTable(v)
-- wandelt v in eine Tabelle, wenn nicht schon bereits
if v ~= nil and type(v) ~= "table" then
v = {v}
end
return v
end
function p.flatten2dTable(t)
-- wandelt eine 2D-Tabelle in eine flache 1D-Tabelle um
local t_flat
if t ~= nil then
t_flat = {}
for _, l in ipairs(p.toTable(t)) do
for _, c in ipairs(p.toTable(l)) do
table.insert(t_flat, c)
end
end
end
return t_flat
end
function p.removeDoubleTableEntries(t)
local cleaned = t
if t ~= nil and type(t) == "table" and #t > 0 then
cleaned = {}
local dict = {}
for _, e in ipairs(t) do
if not dict[e] then
table.insert(cleaned, e)
dict[e] = true
end
end
end
return cleaned
end
function p.isInList(list, val)
local is_in_list = false
for _, v in ipairs(list or {}) do
if v == val then
is_in_list = true
break
end
end
return is_in_list
end
return p