UNPKG

2.29 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 if (typeof fn === "string") fn = emit.bind(null, fn)
25 emit.call(emitter, "newListener", type, fn, scope, _origin)
26 ;(events[type] || (events[type] = [])).unshift(scope, _origin, fn)
27 }
28 return emitter
29 }
30
31 function off(type, fn, scope) {
32 var i, args
33 , emitter = this === exports ? empty : this
34 , events = emitter._e && emitter._e[type]
35 if (events) {
36 for (i = events.length - 2; i > 0; i -= 3) {
37 if ((events[i + 1] === fn || events[i] === fn) && events[i - 1] == scope) {
38 args = events.splice(i - 1, 3)
39 emit.call(emitter, "removeListener", type, args[2], args[0], args[1])
40 if (fn) break
41 }
42 }
43 }
44 return emitter
45 }
46
47 function one(type, fn, scope) {
48 var emitter = this === exports ? empty : this
49 function remove() {
50 emitter.off(type, fn, scope).off(type, remove, scope)
51 }
52 return emitter.on(type, remove, scope).on(type, fn, scope)
53 }
54
55 // emitNext
56 // emitLate
57
58 function emit(type) {
59 var args, i
60 , emitter = this === exports ? empty : this
61 , _e = emitter._e
62 , arr = _e ? (_e[type] || empty).concat(_e["*"] || empty) : empty
63 _e = 0
64 if (i = arr.length) {
65 for (args = arr.slice.call(arguments, 1); i--; ) {
66 arr[i--].apply(arr[--i] || emitter, args)
67 _e++
68 }
69 }
70 return _e
71 }
72
73 function listen(emitter, ev, fn, scope, _origin) {
74 if (emitter) {
75 emitter.on(ev, fn, scope)
76 ;(this._l || (this._l = [])).push([emitter, ev, fn, scope, _origin])
77 }
78 return this
79 }
80
81 function unlisten(key) {
82 var a, i
83 , listening = this._l
84 if (listening) for (i = listening.length; i--; ) {
85 a = listening[i]
86 if (key === "*" || a.indexOf(key) > -1) {
87 listening.splice(i, 1)
88 a[0].off(a[1], a[2], a[3])
89 }
90 }
91 return this
92 }
93
94// `this` refers to the `window` in browser and to the `exports` in Node.js.
95}(this.Event || this)
96