File size: 2,088 Bytes
f8f5b35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"use strict";
module.exports = EventEmitter;

/**

 * Constructs a new event emitter instance.

 * @classdesc A minimal event emitter.

 * @memberof util

 * @constructor

 */
function EventEmitter() {

    /**

     * Registered listeners.

     * @type {Object.<string,*>}

     * @private

     */
    this._listeners = {};
}

/**

 * Registers an event listener.

 * @param {string} evt Event name

 * @param {function} fn Listener

 * @param {*} [ctx] Listener context

 * @returns {util.EventEmitter} `this`

 */
EventEmitter.prototype.on = function on(evt, fn, ctx) {
    (this._listeners[evt] || (this._listeners[evt] = [])).push({
        fn  : fn,
        ctx : ctx || this
    });
    return this;
};

/**

 * Removes an event listener or any matching listeners if arguments are omitted.

 * @param {string} [evt] Event name. Removes all listeners if omitted.

 * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.

 * @returns {util.EventEmitter} `this`

 */
EventEmitter.prototype.off = function off(evt, fn) {
    if (evt === undefined)
        this._listeners = {};
    else {
        if (fn === undefined)
            this._listeners[evt] = [];
        else {
            var listeners = this._listeners[evt];
            for (var i = 0; i < listeners.length;)
                if (listeners[i].fn === fn)
                    listeners.splice(i, 1);
                else
                    ++i;
        }
    }
    return this;
};

/**

 * Emits an event by calling its listeners with the specified arguments.

 * @param {string} evt Event name

 * @param {...*} args Arguments

 * @returns {util.EventEmitter} `this`

 */
EventEmitter.prototype.emit = function emit(evt) {
    var listeners = this._listeners[evt];
    if (listeners) {
        var args = [],
            i = 1;
        for (; i < arguments.length;)
            args.push(arguments[i++]);
        for (i = 0; i < listeners.length;)
            listeners[i].fn.apply(listeners[i++].ctx, args);
    }
    return this;
};