refactorized pseudo-class out

This commit is contained in:
Enrique García Cota 2011-04-24 16:29:51 +02:00
parent d74a00145e
commit 39cee89b94
3 changed files with 37 additions and 21 deletions

View File

@ -4,8 +4,8 @@ h1. cron.lua
h1. Examples of use h1. Examples of use
* @cron.after(time, f)@ will execute f after the given amount of time units. * @cron.after(time, callback)@ will execute callback after the given amount of time units.
* @cron.every(time, f)@ will repeat the same action periodically. * @cron.every(time, callback)@ will repeat the same action periodically.
* @cron.cancel(id)@ will stop a timed event from happening. @id@ is returned by @cron.after@ and @cron.every@ respectively. It will stop a timed event from happening, or stop a periodic action. * @cron.cancel(id)@ will stop a timed event from happening. @id@ is returned by @cron.after@ and @cron.every@ respectively. It will stop a timed event from happening, or stop a periodic action.
* @cron.reset()@ removes all timed and periodic actions, and resets the time passed back to 0. * @cron.reset()@ removes all timed and periodic actions, and resets the time passed back to 0.
* @cron.update(dt)@ is needed to be executed on the main program loop. @dt@ is the amount of time that has passed since the last iteration. When @cron.update@ is executed, cron will check the list of pending actions and execute them if needed. * @cron.update(dt)@ is needed to be executed on the main program loop. @dt@ is the amount of time that has passed since the last iteration. When @cron.update@ is executed, cron will check the list of pending actions and execute them if needed.

View File

@ -6,22 +6,25 @@
----------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------
local function checkTimeAndCallback(time, callback)
assert(type(time) == "number" and time > 0, "time must be a positive number")
assert(type(callback) == "function", "callback must be a function")
end
local entries = {} local entries = {}
local TimedEntry = {} local function newEntry(time, callback, update, ...)
local entry = {
function TimedEntry:new(time, callback, ...)
return setmetatable( {
time = time, time = time,
callback = callback, callback = callback,
args = {...}, args = {...},
running = 0 running = 0,
}, update = update
{ __index = TimedEntry } }
) entries[entry] = entry
end end
function TimedEntry:update(dt) local function updateTimedEntry(self, dt)
self.running = self.running + dt self.running = self.running + dt
if self.running >= self.time then if self.running >= self.time then
self.callback(unpack(self.args)) self.callback(unpack(self.args))
@ -29,6 +32,7 @@ function TimedEntry:update(dt)
end end
end end
local cron = {} local cron = {}
function cron.reset() function cron.reset()
@ -36,11 +40,14 @@ function cron.reset()
end end
function cron.after(time, callback, ...) function cron.after(time, callback, ...)
assert(type(time) == "number" and time > 0, "time must be a positive number") checkTimeAndCallback(time, callback)
assert(type(callback) == "function", "callback must be a function")
return newEntry(time, callback, updateTimedEntry, ...)
end
function cron.every(time, callback, ...)
checkTimeAndCallback(time, callback)
local entry = TimedEntry:new(time, callback, ...)
entries[entry] = entry
end end
function cron.update(dt) function cron.update(dt)

View File

@ -34,7 +34,7 @@ context( 'cron', function()
end) end)
context( 'after', function() context( 'after', function()
test( 'Should throw error if time is not a positive number, or f is not function', function() test( 'Should throw error if time is not a positive number, or callback is not function', function()
assert_error(function() cron.after('error', count) end) assert_error(function() cron.after('error', count) end)
assert_error(function() cron.after(2, 'error') end) assert_error(function() cron.after(2, 'error') end)
assert_error(function() cron.after(-2, count) end) assert_error(function() cron.after(-2, count) end)
@ -61,6 +61,15 @@ context( 'cron', function()
end) end)
end) end)
context( 'every', function()
test( 'Should throw error if time is not a positive number, or callback is not function', function()
assert_error(function() cron.every('error', count) end)
assert_error(function() cron.every(2, 'error') end)
assert_error(function() cron.every(-2, count) end)
assert_not_error(function() cron.every(2, count) end)
end)
end)
end) end)