@mlightcad/common
Version:
[](https://opensource.org/licenses/MIT) [](https://www.npmjs.com/package/@mlightcad/common)
97 lines • 3.23 kB
JavaScript
/**
* @fileoverview Event system implementation for the AutoCAD Common library.
*
* This module provides a type-safe event dispatcher system that allows objects to
* emit and listen to events with proper TypeScript typing support.
*
* @module AcCmEventDispatcher
* @version 1.0.0
*/
/**
* Type-safe event dispatcher implementation.
*
* Provides a robust event system that allows objects to emit and listen to events
* with full TypeScript type safety. Supports both typed event maps and dynamic events.
*
* @template TEventMap - A record type mapping event names to their data payloads.
*
* @example
* ```typescript
* // Define event types
* interface MyEvents {
* load: { url: string }
* error: { message: string }
* }
*
* // Create dispatcher
* const dispatcher = new AcCmEventDispatcher<MyEvents>()
*
* // Add listeners
* dispatcher.addEventListener('load', (event) => {
* console.log(`Loaded: ${event.url}`)
* })
*
* // Dispatch events
* dispatcher.dispatchEvent({ type: 'load', url: 'test.dwg' })
* ```
*/
// eslint-disable-next-line
var AcCmEventDispatcher = /** @class */ (function () {
/**
* Creates {@link AcCmEventDispatcher} object.
*/
function AcCmEventDispatcher() {
this._listeners = {};
}
AcCmEventDispatcher.prototype.addEventListener = function (type, listener) {
if (this._listeners === undefined)
this._listeners = {};
var listeners = this._listeners;
if (listeners[type] === undefined) {
listeners[type] = [];
}
if (listeners[type].indexOf(listener) === -1) {
listeners[type].push(listener);
}
};
AcCmEventDispatcher.prototype.hasEventListener = function (type, listener) {
if (this._listeners === undefined)
return false;
var listeners = this._listeners;
return (listeners[type] !== undefined && listeners[type].indexOf(listener) !== -1);
};
AcCmEventDispatcher.prototype.removeEventListener = function (type, listener) {
if (this._listeners === undefined)
return;
var listeners = this._listeners;
var listenerArray = listeners[type];
if (listenerArray !== undefined) {
var index = listenerArray.indexOf(listener);
if (index !== -1) {
listenerArray.splice(index, 1);
}
}
};
/**
* Fire an event type.
* @param event The event that gets fired.
*/
AcCmEventDispatcher.prototype.dispatchEvent = function (event) {
if (this._listeners === undefined)
return;
var listeners = this._listeners;
var listenerArray = listeners[event.type];
if (listenerArray !== undefined) {
// @ts-expect-error add target property
event.target = this;
// Make a copy, in case listeners are removed while iterating.
var array = listenerArray.slice(0);
for (var i = 0, l = array.length; i < l; i++) {
array[i].call(this, event);
}
}
};
return AcCmEventDispatcher;
}());
export { AcCmEventDispatcher };
//# sourceMappingURL=AcCmEventDispatcher.js.map