local Utils = {}
function Utils.clamp(value, min, max)
if value < min then
return min
elseif value > max then
return max
end
return value
end
function Utils.lerp(a, b, t)
return a + (b - a) * Utils.clamp(t, 0, 1)
end
function Utils.deep_copy(original)
if type(original) ~= "table" then
return original
end
local copy = {}
for key, value in pairs(original) do
if type(value) == "table" then
copy[key] = Utils.deep_copy(value)
else
copy[key] = value
end
end
return setmetatable(copy, getmetatable(original))
end
function Utils.merge(base, override)
local result = {}
for k, v in pairs(base) do
result[k] = v
end
for k, v in pairs(override) do
result[k] = v
end
return result
end
function Utils.filter(list, predicate)
local result = {}
for _, item in ipairs(list) do
if predicate(item) then
table.insert(result, item)
end
end
return result
end
function Utils.map(list, transform)
local result = {}
for i, item in ipairs(list) do
result[i] = transform(item)
end
return result
end
function Utils.reduce(list, reducer, initial)
local acc = initial
for _, item in ipairs(list) do
acc = reducer(acc, item)
end
return acc
end
function Utils.create_emitter()
local emitter = { _handlers = {} }
function emitter:on(event, handler)
if not self._handlers[event] then
self._handlers[event] = {}
end
table.insert(self._handlers[event], handler)
end
function emitter:emit(event, ...)
local handlers = self._handlers[event]
if handlers then
for _, handler in ipairs(handlers) do
handler(...)
end
end
end
function emitter:off(event)
self._handlers[event] = nil
end
return emitter
end
return Utils