diff --git a/problems/js/event-emitter.js b/problems/js/event-emitter.js new file mode 100644 index 0000000..50fbdde --- /dev/null +++ b/problems/js/event-emitter.js @@ -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'); // [] + */