helium/core/signals.lua
Elmārs Āboliņš 3bd423243e help
2020-06-28 18:43:28 +03:00

72 lines
1.6 KiB
Lua

--Internal event/zone/perf-log system
local signals = {}
signals.__index = signals
function signals.newController()
return setmetatable({
stack = {},
eventSubs = {},
zoneSubs = {},
startTime = 0,
totalTime = 0
}, signals)
end
function signals:push(name)
self.stack[#self.stack+1] = {name = name}
self.startTime = love.timer.getTime()
if self.zoneSubs[name] then
for i, e in ipairs(self.zoneSubs[name]) do
if e.on and e.func() then
end
end
end
end
function signals:pop()
local name = self.stack[#self.stack].name
if self.zoneSubs[name] then
for i, e in ipairs(self.zoneSubs[name]) do
if not e.on and e.func() then
end
end
end
self.totalTime = love.timer.getTime() - self.startTime
self.stack[#self.stack] = nil
end
function signals:emitEvent(name, content)
if self.eventSubs[name] then
for i,e in ipairs(self.eventSubs[name]) do
e.func(content)
end
end
end
function signals:onEvent(func, event)
if not self.eventSubs[event] then
self.eventSubs[event] = {}
end
self.eventSubs[event][#self.eventSubs[event]+1] = {func = func}
end
--on - true when new zone is pushed
-- false when zone is popped
function signals:onSignal(func, name, on)
if not self.zoneSubs[name] then
self.zoneSubs[name] = {}
end
self.zoneSubs[name][#self.zoneSubs[name]+1] = {func = func, on = on}
end
return signals