Pinkishu

events.lua v0.7

Jun 24th, 2012
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.78 KB | None | 0 0
  1. local ev = {}
  2. rawset(_G,"events",ev)
  3.  
  4. local programStack = {}
  5. local eventTable = {}
  6. setmetatable(eventTable,{ __mode="v" })
  7. setmetatable(programStack,{ __mode="v" })
  8. local deletionQueue = {}
  9. local osPullEvent = os.pullEvent
  10. local osPullEventRaw = os.pullEventRaw
  11.  
  12. local function getTableID(tabl)
  13.   return string.sub(tostring(tabl),8)
  14. end
  15.  
  16. function isProgramRegistered( co, pID )
  17.   if programStack[ co ] == nil then return false end
  18.   for i,v in ipairs( programStack[co] ) do
  19.     if v == pID then return true end
  20.   end
  21.   return false
  22. end
  23.  
  24. local function getTablePos(checkTable,element)
  25.   for k,v in pairs(checkTable) do
  26.     if v == element then return k end
  27.   end
  28.   return false
  29. end
  30.  
  31. local function queueDeletion(delTable,element)
  32.   if deletionQueue[delTable] == nil then deletionQueue[delTable] = {} end
  33.   local pos = getTablePos(deletionQueue[delTable],element)
  34.   if not pos then table.insert(deletionQueue[delTable],element) end
  35. end
  36.  
  37. local function executeDeletion()
  38.   for k,v in pairs(deletionQueue) do
  39.     for _,v2 in pairs(v) do
  40.       local pos = getTablePos(k,v2)
  41.       if pos then table.remove(k,pos) end
  42.       if #k == 0 then k = nil  break end
  43.     end
  44.   end
  45.  
  46.   deletionQueue = {}
  47. end
  48.  
  49. local function handleEvent(ev,...)
  50.   if eventTable[ev] == nil or #eventTable[ev] == 0 then return false end
  51.   local callTable = {}
  52.  
  53.   for _,v in pairs( eventTable[ev] ) do
  54.     if v[2] ~= nil then
  55.       table.insert(callTable,function() v[2](ev,unpack(arg)) end )
  56.     else
  57.       queueDeletion(eventTable[ev],v)
  58.     end
  59.   end
  60.   executeDeletion()
  61.   if #callTable > 0 then
  62.     parallel.waitForAll(unpack(callTable))
  63.     return true
  64.   else
  65.     return false
  66.   end
  67. end
  68.  
  69. local function insertEvent(co, event, regTable)
  70.   if programStack[co] == nil then
  71.     error("Trying to insert event for unregistered coroutine")
  72.   end
  73.   if eventTable[event] == nil then
  74.     eventTable[event] = {}
  75.   end
  76.   setmetatable(regTable, { __mode = "v" } )
  77.   table.insert(eventTable[event],regTable)
  78.   table.insert(programStack[co][#programStack[co]],regTable)
  79. end
  80.  
  81. function _G.events.registerEvent(event, callback)
  82.   if callback == nil then error("No callback specified") end
  83.   local regTable = {event,callback}
  84.   insertEvent(coroutine.running(), event, regTable)
  85.   return regTable
  86. end
  87.  
  88. function _G.events.getCounts()
  89.   local ret = {{"main",#eventTable}}
  90.   for k,v in pairs(eventTable) do
  91.     if v then
  92.       table.insert(ret,{k,#v})
  93.     end
  94.   end
  95.   return ret
  96. end
  97.  
  98. function _G.events.unregisterEvent(regID,holdDeletion)
  99.   holdDeletion = holdDeletion or false
  100.   local event = regID[1]
  101.  
  102.   if eventTable[event] == nil or #eventTable[event] == 0 then return end
  103.  
  104.   queueDeletion(eventTable[event],regID)
  105.   if not holdDeletion then
  106.     executeDeletion()
  107.   end
  108.  
  109.   if #eventTable[event] == 0 then eventTable[event] = nil end
  110. end
  111.  
  112. function clearProgramEvents( co, pID )
  113.   if programStack[co] == nil then return end
  114.   for _,v in ipairs( programStack[co] ) do
  115.     if v == pID then
  116.       for _,v2 in ipairs(v) do
  117.         events.unregisterEvent(v2,true)
  118.       end
  119.     end
  120.   end
  121.   executeDeletion()
  122. end
  123.  
  124. function registerProgram( co, pID )
  125.   if programStack[ co ] == nil then
  126.     programStack[ co ] = {}
  127.   end
  128.   table.insert(programStack[co],pID)
  129. end
  130.  
  131. function unregisterProgram( co, pID )
  132.   if not isProgramRegistered( co, pID ) then return end
  133.   clearProgramEvents( co, pID )
  134.   queueDeletion(programStack[co],pID)
  135.   executeDeletion()
  136.  
  137. end
  138.  
  139. local orgrun = os.run
  140. function os.run( _tEnv, _sPath, ... )
  141.   local pID = {}
  142.   registerProgram( coroutine.running(), pID )
  143.   orgrun( _tEnv, _sPath, unpack({...}) )
  144.   unregisterProgram( coroutine.running(), pID)
  145. end
  146.  
  147. while true do
  148.   local ev,p1,p2,p3,p4,p5,p6 = os.pullEvent()
  149.   handleEvent(ev,p1,p2,p3,p4,p5,p6)
  150. end
Advertisement
Add Comment
Please, Sign In to add comment