179 lines
2.9 KiB
Lua
179 lines
2.9 KiB
Lua
module 'aux'
|
|
|
|
local T = require 'T'
|
|
|
|
M.immutable = setmetatable(T.acquire(), {
|
|
__metatable = false,
|
|
__newindex = pass,
|
|
__sub = function(_, t)
|
|
return setmetatable(T.acquire(), T.map('__metatable', false, '__newindex', pass, '__index', t))
|
|
end
|
|
})
|
|
|
|
function M.enum(n)
|
|
if n > 0 then return immutable-{}, enum(n - 1) end
|
|
end
|
|
|
|
M.select = T.vararg-function(arg)
|
|
for _ = 1, arg[1] do
|
|
tremove(arg, 1)
|
|
end
|
|
if getn(arg) == 0 then
|
|
return nil
|
|
else
|
|
return unpack(arg)
|
|
end
|
|
end
|
|
|
|
M.join = table.concat
|
|
|
|
M.index = T.vararg-function(arg)
|
|
local t = tremove(arg, 1)
|
|
for _, v in ipairs(arg) do
|
|
t = t and t[v]
|
|
end
|
|
return t
|
|
end
|
|
|
|
M.huge = 1/0
|
|
|
|
function M.modified()
|
|
return IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown()
|
|
end
|
|
|
|
function M.copy(t)
|
|
local copy = T.acquire()
|
|
for k, v in t do
|
|
copy[k] = v
|
|
end
|
|
table.setn(copy, getn(t))
|
|
return setmetatable(copy, getmetatable(t))
|
|
end
|
|
|
|
function M.size(t)
|
|
local size = 0
|
|
for _ in t do
|
|
size = size + 1
|
|
end
|
|
return size
|
|
end
|
|
|
|
function M.key(t, value)
|
|
for k, v in t do
|
|
if v == value then
|
|
return k
|
|
end
|
|
end
|
|
end
|
|
|
|
function M.keys(t)
|
|
local keys = T.acquire()
|
|
for k in t do
|
|
tinsert(keys, k)
|
|
end
|
|
return keys
|
|
end
|
|
|
|
function M.values(t)
|
|
local values = T.acquire()
|
|
for _, v in t do
|
|
tinsert(values, v)
|
|
end
|
|
return values
|
|
end
|
|
|
|
function M.eq(t1, t2)
|
|
if not t1 or not t2 then return false end
|
|
for key, value in t1 do
|
|
if t2[key] ~= value then return false end
|
|
end
|
|
for key, value in t2 do
|
|
if t1[key] ~= value then return false end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function M.any(t, predicate)
|
|
for _, v in t do
|
|
if predicate then
|
|
if predicate(v) then return true end
|
|
elseif v then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function M.all(t, predicate)
|
|
for _, v in t do
|
|
if predicate then
|
|
if not predicate(v) then return false end
|
|
elseif not v then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function M.filter(t, predicate)
|
|
for k, v in t do
|
|
if not predicate(v, k) then t[k] = nil end
|
|
end
|
|
return t
|
|
end
|
|
|
|
function M.map(t, f)
|
|
for k, v in t do
|
|
t[k] = f(v, k)
|
|
end
|
|
return t
|
|
end
|
|
|
|
function M.trim(str)
|
|
return gsub(str, '^%s*(.-)%s*$', '%1')
|
|
end
|
|
|
|
function M.split(str, separator)
|
|
local parts = T.acquire()
|
|
while true do
|
|
local start_index = strfind(str, separator, 1, true)
|
|
if start_index then
|
|
local part = strsub(str, 1, start_index - 1)
|
|
tinsert(parts, part)
|
|
str = strsub(str, start_index + 1)
|
|
else
|
|
local part = strsub(str, 1)
|
|
tinsert(parts, part)
|
|
return parts
|
|
end
|
|
end
|
|
end
|
|
|
|
function M.tokenize(str)
|
|
local tokens = T.acquire()
|
|
for token in string.gfind(str, '%S+') do tinsert(tokens, token) end
|
|
return tokens
|
|
end
|
|
|
|
function M.bounded(lower_bound, upper_bound, number)
|
|
return max(lower_bound, min(upper_bound, number))
|
|
end
|
|
|
|
function M.round(x)
|
|
return floor(x + .5)
|
|
end
|
|
|
|
function M.later(t, t0)
|
|
t0 = t0 or GetTime()
|
|
return function() return GetTime() - t0 > t end
|
|
end
|
|
|
|
function M.signal()
|
|
local params
|
|
return T.vararg-function(arg)
|
|
T.static(arg)
|
|
params = arg
|
|
end, function()
|
|
return params
|
|
end
|
|
end |