-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathemitter.js
102 lines (96 loc) · 3.05 KB
/
emitter.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
export const Event = {
get None() {
const _disposable = { dispose() { } };
return function none() { return _disposable; };
},
};
export class EventEmitter {
static _noop() {}
get event() {
if (!this._event) {
this._event = (listener, thisArg, disposables) => {
if (!this._listeners) {
this._listeners = [];
}
const addedListener = this._listeners.push(!thisArg ?
listener : [listener, thisArg]);
const result = {
dispose: () => {
result.dispose = EventEmitter._noop;
if (this._disposed) {
return;
}
const index = this._listeners.indexOf(addedListener);
this._listeners.splice(index, 1);
},
};
if (disposables && typeof disposables.push === 'function') {
disposables.push(result);
}
return result;
};
}
return this._event;
}
fire(event) {
if (this._listeners) {
// put all [listener,event]-pairs into delivery queue
// then emit all event. an inner/nested event might be
// the driver of this
if (!this._deliveryQueue) {
this._deliveryQueue = [];
}
this._listeners.forEach((listener) => {
this._deliveryQueue.push([listener, event]);
});
while (this._deliveryQueue.length > 0) {
const [listener, e] = this._deliveryQueue.shift();
if (typeof listener === 'function') {
listener.call(undefined, e);
} else {
listener[0].call(listener[1], e);
}
}
}
}
dispose() {
if (this._listeners) {
this._listeners = null;
}
if (this._deliveryQueue) {
this._deliveryQueue.length = 0;
}
this._disposed = true;
}
}
export const subscribeDOM = (emitter, name, listener, thisArg, disposables) => {
const callback = (...args) => {
listener.call(thisArg, ...args);
};
emitter.addEventListener(name, callback);
const result = {
dispose: () => {
emitter.removeEventListener(name, callback);
},
};
if (disposables && typeof disposables.push === 'function') {
disposables.push(result);
}
return result;
};
export const subscribe = (emitter, name, listener, thisArg, disposables) => {
const callback = (...args) => {
listener.call(thisArg, ...args);
};
emitter.on(name, callback);
const result = {
dispose: () => {
emitter.removeListener(name, callback);
},
};
if (disposables && typeof disposables.push === 'function') {
disposables.push(result);
}
return result;
};
export default EventEmitter;