2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
10 local ipairs = ipairs;
12 local t_insert = table.insert;
13 local t_sort = table.sort;
14 local select = select;
19 local dispatchers = {};
22 local function _rebuild_index(event) -- TODO optimize index rebuilding
23 local _handlers = event_map[event];
24 local index = handlers[event];
26 for i=#index,1,-1 do index[i] = nil; end
27 else index = {}; handlers[event] = index; end
28 for handler in pairs(_handlers) do
29 t_insert(index, handler);
31 t_sort(index, function(a, b) return _handlers[a] > _handlers[b]; end);
33 local function add_handler(event, handler, priority)
34 local map = event_map[event];
36 map[handler] = priority or 0;
38 map = {[handler] = priority or 0};
39 event_map[event] = map;
41 _rebuild_index(event);
43 local function remove_handler(event, handler)
44 local map = event_map[event];
47 _rebuild_index(event);
50 local function add_handlers(handlers)
51 for event, handler in pairs(handlers) do
52 add_handler(event, handler);
55 local function remove_handlers(handlers)
56 for event, handler in pairs(handlers) do
57 remove_handler(event, handler);
60 local function _create_dispatcher(event) -- FIXME duplicate code in fire_event
61 local h = handlers[event];
62 if not h then h = {}; handlers[event] = h; end
63 local dispatcher = function(...)
65 local ret = h[i](...);
66 if ret ~= nil then return ret; end
69 dispatchers[event] = dispatcher;
72 local function get_dispatcher(event)
73 return dispatchers[event] or _create_dispatcher(event);
75 local function fire_event(event, ...) -- FIXME duplicates dispatcher code
76 local h = handlers[event];
79 local ret = h[i](...);
80 if ret ~= nil then return ret; end
84 local function get_named_arg_dispatcher(event, ...)
85 local dispatcher = get_dispatcher(event);
89 for i, key in ipairs(keys) do data[key] = select(i, ...); end
94 add_handler = add_handler;
95 remove_handler = remove_handler;
96 add_plugin = add_plugin;
97 remove_plugin = remove_plugin;
98 get_dispatcher = get_dispatcher;
99 fire_event = fire_event;
100 get_named_arg_dispatcher = get_named_arg_dispatcher;
101 _dispatchers = dispatchers;
102 _handlers = handlers;
103 _event_map = event_map;