Unterseiten


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