Implementação do padrão Observador (Observer) com suporte a prioridades e filtros

TypeScript Hard classes

Tarefa «Implementação do padrão Observador (Observer) com suporte a prioridades e filtros»

Crie uma classe `EventBus` que implementa o padrão Observador. Ela deve permitir inscrição em eventos com indicação de prioridade (número inteiro, quanto menor, mais cedo é chamado) e filtro opcional (função que recebe os dados e retorna true se o manipulador deve ser chamado). Ao publicar um evento, os manipuladores são chamados em ordem de prioridade, apenas se o filtro (se definido) retornar true. O manipulador pode ser cancelado por identificador. Implemente os métodos: `subscribe(event: string, handler: Function, priority: number = 0, filter?: (data: any) => boolean): string` (retorna o id da inscrição), `unsubscribe(id: string): void`, `publish(event: string, data: any): void`. Se ocorrer uma exceção ao chamar o manipulador, ela deve ser capturada e exibida no console, mas não deve interromper a execução dos outros manipuladores. Dados de entrada: sequência de comandos (subscribe, unsubscribe, publish). Saída: resultado da execução dos comandos (para publish — via console).

Formato de Entrada

Sequência de comandos, cada um em uma linha separada. Comandos: subscribe <evento> <prioridade> [filtro], unsubscribe <id>, publish <evento> <dados>. Para subscribe: evento — string, prioridade — número inteiro, filtro — string opcional com código do filtro (exemplo: 'data>5'). Para publish: evento — string, dados — valor JSON (número, string, objeto).

Formato de Saída

Para cada comando publish, é exibido o resultado do trabalho dos manipuladores na ordem de chamada: linha no formato 'Handler <id> called with <dados>', cada uma em uma nova linha. Se não houver manipuladores — 'No handlers'. Erros dos manipuladores são ignorados, mas suas mensagens são exibidas no console (não verificadas nos testes).

Exemplos

Exemplo 1

ENTRADA
2 Circle 0.0 0.0 5.0 Rectangle 3.0 2.0 7.0 0.0
SAÍDA

Exemplo 2

ENTRADA
2 Point 1.0 2.0 Circle 3.0 4.0 1.0
SAÍDA
main.ts