UNPKG

ts-lib-extended

Version:
76 lines (75 loc) 2.1 kB
import { DisposableBase } from '../disposable/base.js'; import { Event } from './index.js'; /** * A handler that provides subscribable, public events. * The handler is intended for internal (protected, private) use * * @export * @class EventHandler * @template TSender * @template {EventArgs | void} [TArgs=void] * @extends {DisposableBase} * @since 1.0.0 */ export class EventHandler extends DisposableBase { constructor() { super(); this._callbacks = {}; this._event = new Event((...args_) => this.subscribe(...args_), (...args_) => this.unsubscribe(...args_), (detachEvent_) => { this._detachEvent = detachEvent_; }); } /** * the subscribable event itself * * @readonly * @type {Event<TSender, TArgs>} * @memberof EventHandler * @since 1.0.0 */ get event() { return this.validateDisposed(this._event); } /** * trigger/invoke event * * @param {TSender} sender_ * @param {TArgs} eventArgs_ * @memberof EventHandler * @since 1.0.0 */ invoke(sender_, eventArgs_) { const keys = Object.keys(this._callbacks); for (let i = 0; i < keys.length; i++) { this._callbacks[keys[i]]?.(sender_, eventArgs_); } } subscribe(identifier_, callback_) { if (identifier_ in this._callbacks) { return false; } this._callbacks[identifier_] = callback_; return true; } unsubscribe(identifier_) { if (identifier_ in this._callbacks) { delete this._callbacks[identifier_]; return true; } return false; } disposingInstance() { if (this._detachEvent) { this._detachEvent(); this._detachEvent = undefined; } this._event = undefined; const keys = Object.keys(this._callbacks); for (let i = 0; i < keys.length; i++) { delete this._callbacks[keys[i]]; } } disposedInstance() { /** there is nothing to do */ } }