PGRData/Script/matrix/xcommon/XGlobalFunc.lua

196 lines
4.8 KiB
Lua
Raw Normal View History

local coroutineRunning = coroutine.running
local coroutineResume = coroutine.resume
local coroutineYield = coroutine.yield
local coroutineWrap = coroutine.wrap
local tablePack = table.pack
local tableUnpack = table.unpack
local select = select
function Handler(target, func)
return function(...)
return func(target, ...)
end
end
handler = Handler
function LuaGC()
collectgarbage("collect")
end
--回调转异步任务需和RunAsyn配合使用
---@param func: 带回调的function类型, 示例:local testFunc = function(..., callback) end
---@param callbackPos: 回调在参数列表中的位置, 传nil默认为最后一位, 示例:local testFunc = function(p1, p2, callback) end-->callbackPos = 3
---@return asynTask不处理原函数返回值异步需求默认void原函数中的callback回调将不再可用必须传nil
---@Examplemple
--[[
local testFunc = function(str, cb)
XScheduleManager.ScheduleOnce(function()
XLog.Debug(str)
if cb then cb() end
end, XScheduleManager.SECOND)
end
--callback hell
XLog.Debug("test callback begin")
testFunc("test callback CallBack 1"
, function()
testFunc("test callback CallBack 2"
, function()
testFunc("test callback CallBack 3")
end)
end)
XLog.Debug("test callback end")
--asyn task
XLog.Debug("test asyn task begin")
local asynTest = asynTask(testFunc)
RunAsyn(function()
asynTest("test asyn CallBack 1")
XLog.Debug("test asyn after 1")
asynTest("test asyn CallBack 2")
asynTest("test asyn CallBack 3")
end)
XLog.Debug("test asyn task end")
]]
function asynTask(func, caller, callbackPos)
return function(...)
local results = {}
local isSync --同步方法,回调直接执行
local args = { ... }
local running = coroutineRunning()
2024-09-01 20:49:41 +00:00
callbackPos = callbackPos or select("#", ...) + 1 -- 往当前参数列表,加入控制继续执行的回调
args[callbackPos] = function()
isSync = true
coroutineResume(running, tableUnpack(results))
end
results = caller and tablePack(func(caller, tableUnpack(args))) or tablePack(func(tableUnpack(args)))
return not isSync and coroutineYield() or nil
end
end
--异步等待second秒需和RunAsyn配合使用
function asynWaitSecond(second)
asynTask(
function(cb)
XScheduleManager.ScheduleOnce(cb, second * XScheduleManager.SECOND)
end
)()
end
--异步执行
function RunAsyn(func)
return coroutineWrap(func)()
end
function appendArray(dst, src)
if src == nil then return dst end
for i, v in ipairs(src) do
table.insert(dst, v)
end
return dst
end
-- 保留digit位小数
function getRoundingValue(value, digit)
return math.floor(value * math.pow(10, digit)) / math.pow(10, digit)
end
function math.pow(a, b)
return a ^ b
end
function math.round(value)
return math.floor(value + 0.5)
end
function table.indexof(array, value, begin)
for i = begin or 1, #array do
if array[i] == value then
return i
end
end
return false
end
function table.contains(tbl, ele)
for i, v in pairs(tbl) do
if v == ele then
return true, i
end
end
return false
end
2024-09-01 20:49:41 +00:00
function table.containsKey(tbl, valueKey, ele)
for i, v in pairs(tbl) do
if (v[valueKey] or v[valueKey]()) == ele then
return true, i
end
end
return false
end
function table.dicToArray(dic, keyName, valueName)
keyName = keyName or "key"
valueName = valueName or "value"
local array = {}
for k, v in pairs(dic) do
array[#array + 1] = {
[keyName] = k,
[valueName] = v
}
end
return array
end
function table.arrayToDic(array)
local dic = {}
for i, v in ipairs(array) do
dic[v] = i
end
return dic
end
function table.range(t, start, count)
local ret = {}
for i = start, start + count - 1 do
ret[#ret + 1] = t[i]
end
return ret
end
function table.nums(t)
return XTool.GetTableCount(t)
end
--[[
@desc:
--@t:需要去重的列表
--@bArray: true 更新列表的所有为新索引
false
@return:
]]
function table.unique(t, bArray)
local check = {}
local n = {}
local idx = 1
for k, v in ipairs(t) do
if not check[v] then
if bArray then
n[idx] = v
idx = idx + 1
else
n[k] = v
end
check[v] = true
end
end
return n
end
--程序暂停
function ApplicationPause(pause)
if XEventManager then
XEventManager.DispatchEvent(XEventId.EVENT_APPLICATION_PAUSE, pause)
end
end