diff --git a/packages/stdlib/src/patterns/behavioral/pubsub/index.ts b/packages/stdlib/src/patterns/behavioral/pubsub/index.ts index 5d292fa..0d54f20 100644 --- a/packages/stdlib/src/patterns/behavioral/pubsub/index.ts +++ b/packages/stdlib/src/patterns/behavioral/pubsub/index.ts @@ -1,13 +1,35 @@ export type Subscriber = (...args: any[]) => void; export type EventsRecord = Record; +/** + * Simple PubSub implementation + * + * @template {EventsRecord} Events + */ export class PubSub { + /** + * Events map + * + * @private + * @type {Map>} + */ private events: Map>; + /** + * Creates an instance of PubSub + */ constructor() { this.events = new Map(); } + /** + * Subscribe to an event + * + * @template {keyof Events} K + * @param {K} event Name of the event + * @param {Events[K]} listener Listener function + * @returns {this} + */ public on(event: K, listener: Events[K]) { const listeners = this.events.get(event); @@ -19,6 +41,14 @@ export class PubSub { return this; } + /** + * Unsubscribe from an event + * + * @template {keyof Events} K + * @param {K} event Name of the event + * @param {Events[K]} listener Listener function + * @returns {this} + */ public off(event: K, listener: Events[K]) { const listeners = this.events.get(event); @@ -28,6 +58,14 @@ export class PubSub { return this; } + /** + * Subscribe to an event only once + * + * @template {keyof Events} K + * @param {K} event Name of the event + * @param {Events[K]} listener Listener function + * @returns {this} + */ public once(event: K, listener: Events[K]) { const onceListener = (...args: Parameters) => { this.off(event, onceListener as Events[K]); @@ -39,6 +77,14 @@ export class PubSub { return this; } + /** + * Emit an event + * + * @template {keyof Events} K + * @param {K} event Name of the event + * @param {...Parameters} args Arguments for the listener + * @returns {boolean} + */ public emit(event: K, ...args: Parameters): boolean { const listeners = this.events.get(event); @@ -50,6 +96,13 @@ export class PubSub { return true; } + /** + * Clear all listeners for an event + * + * @template {keyof Events} K + * @param {K} event Name of the event + * @returns {this} + */ public clear(event: K) { this.events.delete(event);