/*
 * EventBus предоставляет централизованный механизм для подписки и публикации событий
 * между различными компонентами приложения, обеспечивая их слабую связанность.
 */

export class EventBus {
	private events: { [key: string]: ((data?: any) => void)[] } = {};

	on(eventName: string, callback: (data?: any) => void): void {
		if (!this.events[eventName]) {
			this.events[eventName] = [];
		}
		this.events[eventName].push(callback);
	}

	off(eventName: string, callback: (data?: any) => void): void {
		if (this.events[eventName]) {
			this.events[eventName] = this.events[eventName].filter((cb) => cb !== callback);
		}
	}

	emit(eventName: string, data?: any): void {
		if (this.events[eventName]) {
			this.events[eventName].forEach((callback) => callback(data));
		}
	}
}
