87 lines
2.4 KiB
Lua
87 lines
2.4 KiB
Lua
-------------------------------------------------------------------------------
|
|
---Use to iterate over a table.
|
|
---Returns three values: the `next` function, the table `t`, and nil,
|
|
---so that the construction :
|
|
---
|
|
--- for k,v in spairs(t) do *body* end
|
|
---will iterate over all key-value pairs of table `t`.
|
|
---
|
|
--- for k,v in pairs(t, function(t,a,b) return t[b] > t[a] end) do *body* end
|
|
---will iterate over all key-value pairs of table `t` with sorting function.
|
|
---
|
|
--- for k,v in pairs(t, function(t,a,b) return t[b].level > t[a].level end) do *body* end
|
|
---will iterate over all key-value pairs of table `t` with sorting function.
|
|
---
|
|
---@param t table --table to traverse.
|
|
---@param order function ---sort function.
|
|
function spairs(t, order)
|
|
---bypass
|
|
if order == nil then return pairs(t) end
|
|
---collect the keys
|
|
local keys = {}
|
|
for k in pairs(t) do keys[#keys+1] = k end
|
|
|
|
---if order function given, sort by it by passing the table and keys a, b,
|
|
---otherwise just sort the keys
|
|
pcall(function()
|
|
table.sort(keys, function(a,b) return order(t, a, b) end)
|
|
end)
|
|
|
|
---return the iterator function
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
if keys[i] then
|
|
return keys[i], t[keys[i]]
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return first element of table
|
|
---@param t table
|
|
---@return any
|
|
function first(t)
|
|
for _,v in pairs(t) do
|
|
return v
|
|
end
|
|
end
|
|
-------------------------------------------------------------------------------
|
|
---formula
|
|
---@param operation string
|
|
---@return number
|
|
function formula(operation)
|
|
if operation == nil or operation == "" then return 0 end
|
|
local allowed = false
|
|
for i=1, string.len(operation) do
|
|
if operation:find("^[0-9.()/*%-+%%^ ]+$") == nil then
|
|
error({code=1}) -- invalid formula
|
|
end
|
|
end
|
|
return load("return " .. operation)()
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---binary to string
|
|
---@param x string
|
|
---@return number
|
|
function toBinStr(x)
|
|
local ret=""
|
|
while x~=1 and x~=0 do
|
|
ret=tostring(x%2)..ret
|
|
x=math.modf(x/2)
|
|
end
|
|
ret=tostring(x)..ret
|
|
return ret
|
|
end
|
|
|
|
|
|
function compare_priority(a,b)
|
|
if a == nil or b == nil then return false end
|
|
for k,v in pairs(a) do
|
|
if b[k] == nil then return false end
|
|
if b[k].name ~= v.name or b[k].value ~= v.value then return false end
|
|
end
|
|
return true
|
|
end
|