problems(js): add “2694. Event Emitter”

Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
Matej Focko 2023-06-03 21:30:58 +02:00
parent 0a4eda37ee
commit efeafcae88
Signed by: mfocko
GPG key ID: 7C47D46246790496

View file

@ -0,0 +1,39 @@
class EventEmitter {
constructor() {
this.mapping = new Map();
}
subscribe(event, cb) {
if (!this.mapping.has(event)) {
this.mapping.set(event, new Array());
}
this.mapping.get(event).push(cb);
return {
unsubscribe: () => {
this.mapping.set(event, this.mapping.get(event).filter(s => s !== cb));
}
};
}
emit(event, args = []) {
if (!this.mapping.has(event)) {
return [];
}
return this.mapping.get(event).map(cb => cb(...args));
}
}
/**
* const emitter = new EventEmitter();
*
* // Subscribe to the onClick event with onClickCallback
* function onClickCallback() { return 99 }
* const sub = emitter.subscribe('onClick', onClickCallback);
*
* emitter.emit('onClick'); // [99]
* sub.unsubscribe(); // undefined
* emitter.emit('onClick'); // []
*/