You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.7 KiB
76 lines
2.7 KiB
"use strict"; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
var factories = []; |
|
factories[0] = function () { |
|
return function dispatcher0() { }; |
|
}; |
|
factories[1] = function (callback, context) { |
|
if (typeof (context) === 'undefined') |
|
return callback; |
|
return function dispatcher1(payload) { |
|
callback(payload, context); |
|
}; |
|
}; |
|
function getFactory(handlerCount) { |
|
if (!factories[handlerCount]) |
|
factories[handlerCount] = compileFactory(handlerCount); |
|
return factories[handlerCount]; |
|
} |
|
function compileFactory(handlerCount) { |
|
var src = 'return function dispatcher' + handlerCount + '(payload) {\n'; |
|
var argsHandlers = [], argsContexts = []; |
|
for (var i = 0; i < handlerCount; i++) { |
|
argsHandlers.push('cb' + i); |
|
argsContexts.push('ctx' + i); |
|
src += ' cb' + i + '(payload, ctx' + i + ');\n'; |
|
} |
|
src += '};'; |
|
return new (Function.bind.apply(Function, [void 0].concat(argsHandlers.concat(argsContexts), [src])))(); |
|
} |
|
var Event = /** @class */ (function () { |
|
function Event() { |
|
this.hasHandlers = false; |
|
this._handlers = []; |
|
this._contexts = []; |
|
this._createDispatcher(); |
|
} |
|
Event.prototype.addHandler = function (handler, context) { |
|
if (!this.isHandlerAttached(handler, context)) { |
|
this._handlers.push(handler); |
|
this._contexts.push(context); |
|
this._createDispatcher(); |
|
this._updateHasHandlers(); |
|
} |
|
return this; |
|
}; |
|
Event.prototype.removeHandler = function (handler, context) { |
|
var idx = this._getHandlerIndex(handler, context); |
|
if (typeof (idx) !== 'undefined') { |
|
this._handlers.splice(idx, 1); |
|
this._contexts.splice(idx, 1); |
|
this._createDispatcher(); |
|
this._updateHasHandlers(); |
|
} |
|
return this; |
|
}; |
|
Event.prototype.isHandlerAttached = function (handler, context) { |
|
return typeof (this._getHandlerIndex(handler, context)) !== 'undefined'; |
|
}; |
|
Event.prototype._updateHasHandlers = function () { |
|
this.hasHandlers = !!this._handlers.length; |
|
}; |
|
Event.prototype._getHandlerIndex = function (handler, context) { |
|
var handlerCount = this._handlers.length; |
|
var idx; |
|
for (idx = 0; idx < handlerCount; idx++) { |
|
if (this._handlers[idx] === handler && this._contexts[idx] === context) |
|
break; |
|
} |
|
return idx < handlerCount ? idx : undefined; |
|
}; |
|
Event.prototype._createDispatcher = function () { |
|
this.dispatch = getFactory(this._handlers.length).apply(this, this._handlers.concat(this._contexts)); |
|
}; |
|
return Event; |
|
}()); |
|
exports.default = Event;
|
|
|