Implementación del patrón Observador (Observer) con soporte de prioridades y filtrado

TypeScript Hard classes

Tarea «Implementación del patrón Observador (Observer) con soporte de prioridades y filtrado»

Cree una clase `EventBus` que implemente el patrón Observador. Debe permitir suscribirse a eventos especificando una prioridad (número entero, cuanto menor, antes se ejecuta) y un filtro opcional (función que recibe datos y devuelve true si se debe invocar el manejador). Al publicar un evento, los manejadores se ejecutan en orden de prioridad, solo si el filtro (si se especifica) devuelve true. El manejador puede ser cancelado mediante un identificador. Implemente los métodos: `subscribe(event: string, handler: Function, priority: number = 0, filter?: (data: any) => boolean): string` (devuelve el id de la suscripción), `unsubscribe(id: string): void`, `publish(event: string, data: any): void`. Si al invocar un manejador ocurre una excepción, debe ser capturada y mostrada en la consola, pero no debe interrumpir la ejecución de otros manejadores. Datos de entrada: secuencia de comandos (subscribe, unsubscribe, publish). Salida: resultado de la ejecución de los comandos (para publish — a través de la consola).

Formato de entrada

Secuencia de comandos, cada uno en una línea separada. Comandos: subscribe <event> <priority> [filter], unsubscribe <id>, publish <event> <data>. Para subscribe: event — cadena, priority — número entero, filter — cadena opcional con código de filtro (por ejemplo, 'data>5'). Para publish: event — cadena, data — valor JSON (número, cadena, objeto).

Formato de salida

Para cada comando publish se muestra el resultado de la ejecución de los manejadores en el orden de su invocación: una línea con el formato 'Handler <id> called with <data>', cada una en una nueva línea. Si no hay manejadores — 'No handlers'. Los errores de los manejadores se ignoran, pero sus mensajes se muestran en la consola (no se verifican en las pruebas).

Ejemplos

Ejemplo 1

ENTRADA
2 Circle 0.0 0.0 5.0 Rectangle 3.0 2.0 7.0 0.0
SALIDA

Ejemplo 2

ENTRADA
2 Point 1.0 2.0 Circle 3.0 4.0 1.0
SALIDA
main.ts