local utils = {} utils.sizeof = function(t) if not t then return 0 end local size = 0 for k,v in pairs(t) do size = size + 1 end return size end utils.shallowDiff = function(a, b) local counters = {} for k,v in pairs(a) do local currentCounter = counters[v] or 0 counters[v] = currentCounter + 1 end for k,v in pairs(b) do if counters[v] then counters[v] = counters[v] - 1 end end local ret = {} local n = 0 for k,v in pairs(a) do if counters[v] and counters[v] > 0 then counters[v] = counters[v] - 1 n = n + 1 ret[n] = v end end return ret end utils.shallowClone = function(t) if not t then return t end local res = {} for k,v in pairs(t) do res[k] = v end return res end utils.merge = function(a, b) local res = {} for k, v in pairs(a) do res[k] = v end for k, v in pairs(b) do res[k] = v end return res end utils.concat = function(a, b) local res = {} local i = 0 for _, v in pairs(a) do res[i] = v i = i + 1 end for _, v in pairs(b) do res[i] = v i = i + 1 end return res end utils.find = function(t, predicate) for k,v in pairs(t) do if predicate(v, k) then return v, k end end end -- repeat n times the given element x in a new table utils.rep = function(x, n) if n < 1 then return {} end local result = {} for i=1, n, 1 do result[i] = x end return result end return utils