Event emitter funcional
Em aplicações JavaScript reais, como no Node.js com EventEmitter ou no front-end com listeners de DOM, o padrão Observer é a base para reagir a eventos de forma desacoplada. Dominar a criação de um event emitter com closures permite entender como bibliotecas e frameworks gerenciam eventos internamente, e como construir sistemas modulares que se comunicam sem acoplamento direto.
O PROBLEMA
Crie criarEventEmitter() com on, off e emit usando closure. Implemente Observer pattern.
EXEMPLO
const ee = criarEventEmitter();
ee.on('click', handler);
ee.emit('click', {x:10}) → handler chamadoSOBRE O CONCEITO
O exercício implementa o padrão Observer usando uma função criarEventEmitter() que retorna um objeto com on, off e emit. A chave é usar closure para armazenar um objeto (eventos) que mapeia cada tipo de evento a um array de callbacks. on adiciona um callback ao array daquele evento. emit percorre o array e chama cada callback com os argumentos passados. off deve remover um callback específico; o erro comum é remover todos ou não remover corretamente. Para remover apenas um, use filter no array, comparando a referência da função. Exemplo: eventos[evento] = eventos[evento].filter(cb => cb !== callback). Isso garante que apenas aquele handler seja removido, mantendo os demais intactos.
RESOLUÇÃO