Documentation for this module may be created at Module:Data/doc
p = {} p.keys = function(data) local keys = {} for k,v in pairs(data) do table.insert(keys, k) end return keys end p.sort = function(data, comparison) if isTable(comparison) then comparison = p.combineComparisons(comparison) end local keyOrder = p.keys(data) function cmp(key1, key2) return comparison(data[key1], data[key2]) end table.sort(keyOrder, cmp) local sorted = {} for i,k in ipairs(keyOrder) do table.insert(sorted, data[k]) end return sorted end p.filter = function(data, predicate) local filtered = {} for i,v in ipairs(data) do if predicate(v) then table.insert(filtered, v) end end for k,v in pairs(data) do if type(k) ~= 'number' and predicate(v) then filtered[k] = v end end return filtered end safeCompare = function(a, b) if type(a) ~= type(b) then return type(a) < type(b) end if a == nil then return false end -- Can't compare booleans in lua if a == false then return b end if a == true then return false end return a < b end p.asc = safeCompare p.desc = function(a, b) return p.asc(b, a) end p.on = function(f, c) return function(a, b) return c(f(a), f(b)) end end p.combineComparisons = function(comparisons) return function(a, b) for i,c in ipairs(comparisons) do if c(a, b) then return true end if c(b, a) then return false end end return false end end function isTable(t) return type(t) == 'table' end safeGet = function(data, key) if isTable(data) then return data[key] end end p.path = function(path) return function(data) local result = data for i,k in ipairs(path) do result = safeGet(result, k) end return result end end return p