local function defaultTimeout() end ---@class Timer ---@field duration number ---@field time number ---@field oneShot boolean ---@field timeout function ---@field data table ---@field paused boolean Timer = { duration = 1, time = 1, oneShot = false, timeout = defaultTimeout, data = {}, paused = true } ---@param duration number|nil ---@param oneShot boolean|nil ---@param timeout function|nil ---@param data table|nil ---@return Timer function Timer:new( duration, oneShot, timeout, data ) local timer = { duration = duration or self.duration, time = duration or self.duration, oneShot = oneShot or self.oneShot, timeout = timeout or self.timeout, data = data or self.data, paused = self.paused, } setmetatable( timer, { __index = self } ) return timer end ---@param dt number function Timer:tick( dt ) if self.paused then return end self.time = self.time - dt if self.time <= 0 then self.timeout( self.data ) if self.oneShot then self.paused = true self.time = 0 else self.time = self.duration + self.time end end end ---@param duration number|nil function Timer:start( duration ) self.paused = false if duration ~= nil then self.duration = duration end self.time = self.duration end ---@param emit boolean function Timer:stop( emit ) self.paused = true self.time = 0 if emit then self.timeout( self.data ) end end function Timer:elapsed() return self.duration - self.time end