You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.2 KiB
Lua

--[=[
@c Clock x Emitter
@t ui
@mt mem
@d Used to periodically execute code according to the ticking of the system clock instead of an arbitrary interval.
]=]
local timer = require('timer')
local Emitter = require('utils/Emitter')
local date = os.date
local setInterval, clearInterval = timer.setInterval, timer.clearInterval
local Clock = require('class')('Clock', Emitter)
function Clock:__init()
Emitter.__init(self)
end
--[=[
@m start
@op utc boolean
@r nil
@d Starts the main loop for the clock. If a truthy argument is passed, then UTC
time is used; otherwise, local time is used. As the clock ticks, an event is
emitted for every `os.date` value change. The event name is the key of the value
that changed and the event argument is the corresponding date table.
]=]
function Clock:start(utc)
if self._interval then return end
local fmt = utc and '!*t' or '*t'
local prev = date(fmt)
self._interval = setInterval(1000, function()
local now = date(fmt)
for k, v in pairs(now) do
if v ~= prev[k] then
self:emit(k, now)
end
end
prev = now
end)
end
--[=[
@m stop
@r nil
@d Stops the main loop for the clock.
]=]
function Clock:stop()
if self._interval then
clearInterval(self._interval)
self._interval = nil
end
end
return Clock