UNPKG

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