summaryrefslogtreecommitdiff
path: root/src/util.lua
blob: 8fccab24c0079bab1120100554e24a0a7c1b3081 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
--[[
Various helpful functions
]]
local util = {}
function util.cartesian(...)
	-- cartesian(tbl1, tbl2, tbl3, ...)
	-- for each table, returns a permutation of key, value in tbl1, tbl2, ect.
	local args = {...}
	return coroutine.wrap(function()
		local cursors = {} -- cursors[1], cursors[3], ect. are the keys
		for k,v in ipairs(args) do
			local a,b = next(v,nil)
			cursors[(k*2) - 1] = a
			cursors[(k*2)] = b
		end
		coroutine.yield(unpack(cursors))
		local any_left = true
		while any_left do
			while next(args[#args],cursors[#cursors - 1]) do
				local a,b = next(args[#args],cursors[#cursors - 1])
				cursors[#cursors - 1] = a
				cursors[#cursors] = b
				coroutine.yield(unpack(cursors))
			end
			any_left = false
			for i = #args, 1, -1 do
				if next(args[i],cursors[(i*2)-1]) then
					cursors[(i*2)-1], cursors[i*2] = next(args[i],cursors[(i*2)-1])
					for j = i+1, #args do
						cursors[(j*2)-1], cursors[j*2] = next(args[j],nil)
					end
					coroutine.yield(unpack(cursors))
					any_left = true
					break
				end
			end
		end
	end)
end

-- Override tostring to display more info about the table
local old_tostring = tostring
local numtabs = 0
local printed_tables = {}
local function tostring_helper(el)
        assert(type(el) == "table", "Tried to call helper with something that was not a table, it was a " .. type(el))
        local mt = getmetatable(el)
        if mt and mt.__tostring then
                return mt.__tostring(el)
        elseif printed_tables[el] == true then
                return old_tostring(el)
        else
                printed_tables[el] = true
                numtabs = numtabs + 1
                local strbuilder = {"{"}
                for k,v in pairs(el) do
                        local key,value
                        if type(k) == "table" then
                                key = tostring_helper(k)
                        else
                                key = old_tostring(k)
                        end
                        if type(v) == "table" then
                                value = tostring_helper(v)
                        else
                                value = old_tostring(v)
                        end
                        strbuilder[#strbuilder + 1] = string.format("%s%s : %s", string.rep("\t",numtabs), key, value)
                end
                strbuilder[#strbuilder + 1] = string.rep("\t",numtabs - 1) .. "}"
                numtabs = numtabs - 1
                return table.concat(strbuilder,"\n")
        end

end
function tostring(el)
        printed_tables = {}
        if type(el) == "table" then
                return tostring_helper(el)
        end
        return old_tostring(el)
end

return util