local util = {} function util.deepEqual(a, b) local varType = type(a) if varType ~= type(b) then return false end if varType == "table" then for key,_ in pairs(b) do if a[key] == nil then return false end end for key,value in pairs(a) do if not util.deepEqual(value, b[key]) then return false end end return true end return a == b end function util.find(array, f) for k,v in pairs(array) do if f(v, k) then return v end end return nil end function util.findAll(array, f) local matches = {} for k,v in pairs(array) do if f(v, k) then table.insert(matches, v) end end return matches end function util.isEmpty(tbl) local next, t = pairs(tbl) return next(t) == nil end function util.fuzzyEquals(value, pattern) local valueType = type(value) local patternType = type(pattern) if patternType == "nil" then return true end if patternType == "function" then return pattern(value) end if valueType ~= patternType then return false end if valueType == "table" then for k,_ in pairs(pattern) do if value[k] == nil then return false end end for k,v in pairs(value) do if not util.fuzzyEquals(v, pattern[k]) then return false end end return true end return value == pattern end return util