Implement a full EventEmitter with `on`, `once`, `off`, `emit`, and `listenerCount` methods.
Problem Statement
Implement a full EventEmitter with `on`, `once`, `off`, `emit`, and `listenerCount` methods.
Complexity
Time Complexity: -
Space Complexity: -
Hints
š” Hint 1:
once() registers a listener that auto-removes after first call.
š” Hint 2:
Wrap the once listener in a function that calls off after execution.
š” Hint 3:
listenerCount(event) returns the number of listeners for that event.
ā
Solution:
```javascript
class EventEmitter {
constructor() { this.events = {}; }
on(event, fn) { (this.events[event] = this.events[event] || []).push(fn); return this; }
once(event, fn) {
const wrapper = (...args) => { this.off(event, wrapper); fn(...args); };
wrapper._original = fn;
this.on(event, wrapper);
return this;
}
off(event, fn) {
this.events[event] = (this.events[event] || []).filter(f => f !== fn && f._original !== fn);
return this;
}
emit(event, ...args) { (this.events[event] || []).forEach(fn => fn(...args)); return this; }
listenerCount(event) { return (this.events[event] || []).length; }
}
```