49 lines
1.3 KiB
JavaScript
49 lines
1.3 KiB
JavaScript
const registered_listeners = new Map();
|
|
|
|
export function trigger (event_name, data) {
|
|
for (const callback of listeners(event_name)) {
|
|
callback(data);
|
|
}
|
|
}
|
|
|
|
export function listen (event_name, callback) {
|
|
listeners(event_name).push(callback);
|
|
// to find an event later, for deletion or other things.
|
|
return [event_name, listeners(event_name).length - 1];
|
|
}
|
|
|
|
// makes a callback function stop being used to listen to an event, and returns that callback function.
|
|
export function ignore (listener_id) {
|
|
const [event_name, index] = listener_id;
|
|
return listeners(event_name).splice(index, 1)[0];
|
|
}
|
|
|
|
function listeners (event_name) {
|
|
if (!registered_listeners.has(event_name))
|
|
registered_listeners.set(event_name, []);
|
|
|
|
return registered_listeners.get(event_name);
|
|
}
|
|
|
|
|
|
|
|
export function attach_listener (target, event_name, callback) {
|
|
return listen(event_name, data => {
|
|
if (data.target === target) {
|
|
callback(data);
|
|
}
|
|
});
|
|
}
|
|
|
|
export function create_alias (event_name, alias) {
|
|
// note that aliases are one-directional; `event_name` isn't triggered when `alias` is.
|
|
return listen(event_name, data => trigger(alias, data));
|
|
}
|
|
|
|
export function create_group (group_name, members) {
|
|
// TODO: return list of event id:s so groups can be `ignore`:d.
|
|
for (const event_name of members) {
|
|
create_alias(event_name, group_name);
|
|
}
|
|
}
|