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
57 lines
1.2 KiB
Lua
3 years ago
|
--[=[
|
||
|
@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
|