Реализация паттерна Наблюдатель (Observer) с поддержкой приоритетов и фильтрации

TypeScript Сложный classes

Задача «Реализация паттерна Наблюдатель (Observer) с поддержкой приоритетов и фильтрации»

Создайте класс `EventBus`, который реализует паттерн Наблюдатель. Он должен позволять подписываться на события с указанием приоритета (целое число, чем меньше, тем раньше вызывается) и опциональным фильтром (функция, принимающая данные и возвращающая true, если обработчик должен быть вызван). При публикации события обработчики вызываются в порядке приоритета, только если фильтр (если задан) возвращает true. Обработчик может быть отписан по идентификатору. Реализуйте методы: `subscribe(event: string, handler: Function, priority: number = 0, filter?: (data: any) => boolean): string` (возвращает id подписки), `unsubscribe(id: string): void`, `publish(event: string, data: any): void`. Если при вызове обработчика возникает исключение, оно должно быть перехвачено и выведено в консоль, но не должно прерывать выполнение других обработчиков. Входные данные: последовательность команд (subscribe, unsubscribe, publish). Выходные: результат выполнения команд (для publish — через консоль).

Формат ввода

Последовательность команд, каждая на отдельной строке. Команды: subscribe <event> <priority> [filter], unsubscribe <id>, publish <event> <data>. Для subscribe: event — строка, priority — целое число, filter — опциональная строка с кодом фильтра (например, 'data>5'). Для publish: event — строка, data — JSON-значение (число, строка, объект).

Формат вывода

Для каждой команды publish выводится результат работы обработчиков в порядке их вызова: строка вида 'Handler <id> called with <data>', каждая с новой строки. Если обработчиков нет — 'No handlers'. Ошибки обработчиков игнорируются, но их сообщения выводятся в консоль (в тестах не проверяются).

Примеры

Пример 1

ВВОД
2 Circle 0.0 0.0 5.0 Rectangle 3.0 2.0 7.0 0.0
ВЫВОД

Пример 2

ВВОД
2 Point 1.0 2.0 Circle 3.0 4.0 1.0
ВЫВОД
main.ts