util.events: Much more efficient index building
authorWaqas Hussain <waqas20@gmail.com>
Sat, 16 May 2009 21:06:35 +0000 (02:06 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Sat, 16 May 2009 21:06:35 +0000 (02:06 +0500)
util/events.lua

index 54816271bebf73d49885b26d8b5f3aedc686eadb..dc294a5539456e55a6f9f9195efb19004d9af3f8 100644 (file)
@@ -11,17 +11,16 @@ function new()
        local dispatchers = {};\r
        local handlers = {};\r
        local event_map = {};\r
-       local function _rebuild_index() -- TODO optimize index rebuilding\r
-               for event, _handlers in pairs(event_map) do\r
-                       local index = handlers[event];\r
-                       if index then\r
-                               for i=#index,1,-1 do index[i] = nil; end\r
-                       else index = {}; handlers[event] = index; end\r
-                       for handler in pairs(_handlers) do\r
-                               t_insert(index, handler);\r
-                       end\r
-                       t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);\r
+       local function _rebuild_index(event) -- TODO optimize index rebuilding\r
+               local _handlers = event_map[event];\r
+               local index = handlers[event];\r
+               if index then\r
+                       for i=#index,1,-1 do index[i] = nil; end\r
+               else index = {}; handlers[event] = index; end\r
+               for handler in pairs(_handlers) do\r
+                       t_insert(index, handler);\r
                end\r
+               t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);\r
        end;\r
        local function add_handler(event, handler, priority)\r
                local map = event_map[event];\r
@@ -31,13 +30,13 @@ function new()
                        map = {[handler] = priority or 0};\r
                        event_map[event] = map;\r
                end\r
-               _rebuild_index();\r
+               _rebuild_index(event);\r
        end;\r
        local function remove_handler(event, handler)\r
                local map = event_map[event];\r
                if map then\r
                        map[handler] = nil;\r
-                       _rebuild_index();\r
+                       _rebuild_index(event);\r
                end\r
        end;\r
        local function add_plugin(plugin)\r