198 lines
4.4 KiB
Lua
198 lines
4.4 KiB
Lua
--
|
||
-- Utilities.lua
|
||
--
|
||
-- Useful helper functions and API extensions.
|
||
-- Place your own utilities in "utilities/Utilities.lua"
|
||
--
|
||
|
||
Utilities = {}
|
||
|
||
function Utilities.copy(obj, seen)
|
||
if type(obj) ~= 'table' then return obj end
|
||
if seen and seen[obj] then return seen[obj] end
|
||
local s = seen or {}
|
||
local res = setmetatable({}, getmetatable(obj))
|
||
s[obj] = res
|
||
for k, v in pairs(obj) do res[Utilities.copy(k, s)] = Utilities.copy(v, s) end
|
||
return res
|
||
end
|
||
|
||
function Utilities.isNull(__object)
|
||
return __object == nil or __object == ''
|
||
end
|
||
function Utilities.isNotNull(__object)
|
||
return __object ~= nil and __object ~= ''
|
||
end
|
||
|
||
function Utilities.startsWith(__string, __start)
|
||
return __string:sub(1, #__start) == __start
|
||
end
|
||
|
||
function Utilities.endsWith(__string, __ending)
|
||
return __ending == "" or __string:sub(-#__ending) == __ending
|
||
end
|
||
|
||
function Utilities.handleOptionalBoolean(__argument, __default)
|
||
if (__argument == nil) then
|
||
return __default
|
||
elseif (__argument == true or __argument == false) then
|
||
return __argument
|
||
else
|
||
error("BONK: You shouldn’t pass non-boolean value as a boolean parameter.")
|
||
return __argument
|
||
end
|
||
end
|
||
|
||
Utilities.varName = {}
|
||
setmetatable(
|
||
Utilities.varName,
|
||
{
|
||
__index = function(self, __key, __value)
|
||
return string.format('%s', __key)
|
||
end
|
||
}
|
||
)
|
||
|
||
|
||
function Utilities.getHypotenuse(__x,__y)
|
||
return math.sqrt((__x*__x)+(__y*__y))
|
||
end
|
||
|
||
function Utilities.average(__a, __b)
|
||
return (__a + __b) / 2
|
||
end
|
||
|
||
function Utilities.screenshot()
|
||
return Graphics.getDisplayImage()
|
||
end
|
||
|
||
function Utilities.autoTable(__numberOfDimensions)
|
||
local metatable = {};
|
||
for i = 1, __numberOfDimensions do
|
||
metatable[i] = {
|
||
__index = function(__table, __key)
|
||
if i < __numberOfDimensions then
|
||
__table[__key] = setmetatable({}, metatable[i+1])
|
||
return __table[__key];
|
||
end
|
||
end
|
||
}
|
||
end
|
||
return setmetatable({}, metatable[1]);
|
||
end
|
||
|
||
function Utilities.newUUID()
|
||
local func = function(x)
|
||
local random = math.random(16) - 1
|
||
random = (x == "x") and (random + 1) or (random % 4) + 9
|
||
return ("0123456789abcdef"):sub(random, random)
|
||
end
|
||
return (("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"):gsub("[xy]", func))
|
||
end
|
||
|
||
|
||
-- New math methods
|
||
--
|
||
|
||
function math.clamp(__value, __min, __max)
|
||
if (__min > __max) then
|
||
__min, __max = __max, __min
|
||
end
|
||
return math.max(__min, math.min(__max, __value))
|
||
end
|
||
|
||
function math.ring(__value, __min, __max)
|
||
if (__min > __max) then
|
||
__min, __max = __max, __min
|
||
end
|
||
return __min + (__value - __min) % (__max - __min)
|
||
end
|
||
|
||
function math.ringInt(__value, __min, __max)
|
||
return math.ring(__value, __min, __max + 1)
|
||
end
|
||
|
||
function math.approach(_value, __target, __step)
|
||
if (_value == __target) then
|
||
return _value, true
|
||
end
|
||
local d = __target - _value
|
||
if (d > 0) then
|
||
_value = _value + __step
|
||
if (_value >= __target) then
|
||
return __target, true
|
||
else
|
||
return _value, false
|
||
end
|
||
elseif (d < 0) then
|
||
_value = _value - __step
|
||
if (_value <= __target) then
|
||
return __target, true
|
||
else
|
||
return _value, false
|
||
end
|
||
else
|
||
return _value, true
|
||
end
|
||
end
|
||
|
||
function math.infiniteApproach(at_zero, at_infinite, x_halfway, x)
|
||
return at_infinite - (at_infinite - at_zero) * 0.5 ^ (x / x_halfway)
|
||
end
|
||
|
||
function math.round(__value, __bracket)
|
||
local bracket = __bracket or 1
|
||
return math.floor(__value/bracket + math.sign(__value) * 0.5) * bracket
|
||
end
|
||
|
||
function math.sign(__value)
|
||
return (__value >= 0 and 1) or -1
|
||
end
|
||
|
||
function math.lerp(a, b, t)
|
||
return a + (b - a) * t
|
||
end
|
||
|
||
-- New array/table methods
|
||
--
|
||
|
||
function table.merge(__table1, __table2)
|
||
local mergedTable = {}
|
||
for k,v in pairs(__table1) do
|
||
mergedTable[k] = v
|
||
end
|
||
for k,v in pairs(__table2) do
|
||
mergedTable[k] = v
|
||
end
|
||
return mergedTable
|
||
end
|
||
|
||
function table.random(__table)
|
||
if (type(__table) ~= "table") then return nil end
|
||
return __table[math.ceil(math.random(#__table))]
|
||
end
|
||
function table.each(__table, __function)
|
||
if (type(__function) ~= "function") then return end
|
||
for _, e in pairs(__table) do
|
||
__function(e)
|
||
end
|
||
end
|
||
|
||
function table.filter(__table, __filter)
|
||
local out = {}
|
||
for _, value in pairs(__table) do
|
||
--if filterIter(v, k, table) then out[k] = v end
|
||
if (__filter(value)) then
|
||
__table.insert (out,value)
|
||
end
|
||
end
|
||
|
||
return out
|
||
end
|
||
|
||
function table.getSize(__table)
|
||
local count = 0
|
||
for _, _ in pairs(__table) do count += 1 end
|
||
return count
|
||
end
|