statemonitor: to register callbacks to state

It takes two functions; one is to check the state and the other is a
callback to execute if the first function evaluates true. It can
automatically handling deregistering functions once they are no longer
needed
This commit is contained in:
NullBite 2023-06-26 01:33:56 -04:00
parent 72f20234f0
commit 6b985f6574
Signed by: nullbite
GPG Key ID: 6C4D545385D4925A

43
statemonitor.lua Normal file
View File

@ -0,0 +1,43 @@
local statemonitor={}
local callbacks={}
local function ternary(val, t, f)
if val then return t else return f end
end
--- Deregister a callback
---@param name string Name of callback
function statemonitor.deregister(name)
callbacks[name] = nil
end
--- Register a callback to a function
--Registers a callback to run when a check funciton evaluates to true
---@param name string Name of callback
---@param check function Function to evaluate
---@param callback function Callback to run when true
---@param frequency? integer Frequency to run the check, in ticks (default 5)
---@param once? boolean Whether the callback should be deregistered after running once, default true
function statemonitor.register(name, check, callback, frequency, once)
frequency=frequency or 5
once=ternary(once ~= nil, once, true)
callbacks[name] = {check=check, callback=callback, f=frequency,
deregister=once}
end
local function tick()
for k, v in pairs(callbacks) do
if world.getTimeOfDay() % v.f and v.check() then
v.callback()
if v.deregister then
statemonitor.deregister(k)
end
end
end
end
events.TICK:register(tick, "nulllib.statemonitor")
return statemonitor