UNPKG

2.24 kBJavaScriptView Raw
1
2!function(exports) {
3 var empty = []
4
5 exports.Emitter = EventEmitter
6 exports.asEmitter = asEmitter
7
8 function EventEmitter() {}
9
10 function asEmitter(obj) {
11 obj.on = on
12 obj.off = off
13 obj.one = one
14 obj.emit = emit
15 obj.listen = listen
16 obj.unlisten = unlisten
17 }
18 asEmitter(EventEmitter.prototype)
19
20 function on(type, fn, scope, _origin) {
21 var emitter = this === exports ? empty : this
22 , events = emitter._e || (emitter._e = Object.create(null))
23 if (type && fn) {
24 emit.call(emitter, "newListener", type, fn, scope, _origin)
25 ;(events[type] || (events[type] = [])).unshift(scope, _origin, fn)
26 }
27 return emitter
28 }
29
30 function off(type, fn, scope) {
31 var i, args
32 , emitter = this === exports ? empty : this
33 , events = emitter._e && emitter._e[type]
34 if (events) {
35 for (i = events.length - 2; i > 0; i -= 3) {
36 if ((events[i + 1] === fn || events[i] === fn) && events[i - 1] == scope) {
37 args = events.splice(i - 1, 3)
38 emit.call(emitter, "removeListener", type, args[2], args[0], args[1])
39 if (fn) break
40 }
41 }
42 }
43 return emitter
44 }
45
46 function one(type, fn, scope) {
47 var emitter = this === exports ? empty : this
48 function remove() {
49 emitter.off(type, fn, scope).off(type, remove, scope)
50 }
51 return emitter.on(type, remove, scope).on(type, fn, scope)
52 }
53
54 // emitNext
55 // emitLate
56
57 function emit(type) {
58 var args, i
59 , emitter = this === exports ? empty : this
60 , _e = emitter._e
61 , arr = _e ? (_e[type] || empty).concat(_e["*"] || empty) : empty
62 _e = 0
63 if (i = arr.length) {
64 for (args = arr.slice.call(arguments, 1); i--; ) {
65 arr[i--].apply(arr[--i] || emitter, args)
66 _e++
67 }
68 }
69 return _e
70 }
71
72 function listen(emitter, ev, fn, scope, _origin) {
73 if (emitter) {
74 emitter.on(ev, fn, scope)
75 ;(this._l || (this._l = [])).push([emitter, ev, fn, scope, _origin])
76 }
77 return this
78 }
79
80 function unlisten(key) {
81 var a, i
82 , listening = this._l
83 if (listening) for (i = listening.length; i--; ) {
84 a = listening[i]
85 if (key === "*" || a.indexOf(key) > -1) {
86 listening.splice(i, 1)
87 a[0].off(a[1], a[2], a[3])
88 }
89 }
90 return this
91 }
92
93// `this` refers to the `window` in browser and to the `exports` in Node.js.
94}(this.Event || this)
95