/
eventCategory.js
116 lines (103 loc) · 2.5 KB
/
eventCategory.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import event from "./event.js";
/**
* Keeps a list of events.
*/
export default function eventCategory() {
let that = {};
// Map of events with name as key
let namedEvents = {};
let events = [];
/**
* Lazily makes sure that an event exists for "name".
*
* @param name {String}
* @returns {event} Also return the event
*/
function ensureEventHolderFor(name) {
if (!hasEventNamed(name)) {
addEvent(event(), name);
}
return namedEvents[name];
}
/**
* Create a new event and if name i supplied adds it to event manager
*
* @param [name] {string} Name of event in eventHandler
* @returns {event}
*/
that.createEvent = function (name) {
return addEvent(event(), name);
};
/**
* Binds callback to a named event. The callback will be invoked whenever the event is fired.
*
* @param name {String}
* @param callback {function}
*/
that.register = function (name, callback) {
return ensureEventHolderFor(name).register(callback);
};
/**
* Removed "binding" attached to event.
* @param name {String} Name of event
* @param binding {eventBinding} Binding
*/
that.unregister = function (name, binding) {
return ensureEventHolderFor(name).unregister(binding);
};
/**
* Like on() except callback will only be fired once
*
* @param name
* @param callback
* @returns {*}
*/
that.registerOnce = function (name, callback) {
return ensureEventHolderFor(name).registerOnce(callback);
};
/**
* Trigger all callbacks attached to event
* @param name
* @param arguments Any arguments to trigger is sent as arguments to callback.
*/
that.trigger = function (name) {
let params = Array.prototype.slice.call(arguments, 1);
// eslint-disable-next-line no-shadow -- we should fix that later
let event = ensureEventHolderFor(name);
event.trigger.apply(that, params);
};
/**
* Dispose all events.
*/
that.dispose = function () {
// eslint-disable-next-line no-shadow -- we should fix that later
events.forEach((event) => {
event.dispose();
});
namedEvents = {};
events = [];
};
/**
* Answers true if an event with name exists
*
* @param name {String}
* @returns {boolean}
*/
function hasEventNamed(name) {
return namedEvents[name] !== undefined;
}
/**
* @param event {event}
* @param [name] {string}
* @returns {event}
*/
// eslint-disable-next-line no-shadow -- we should fix that later
function addEvent(event, name) {
events.push(event);
if (name) {
namedEvents[name] = event;
}
return event;
}
return that;
}