UNPKG

@mlightcad/common

Version:

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://img.shields.io/npm/v/@mlightcad/common.svg)](https://www.npmjs.com/package/@mlightcad/common)

97 lines 3.23 kB
/** * @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