class EventEmitter {
#event = Object.create(null)
on(type, listener) {
this.#event[type] = this.#event[type] ?? []
this.#event[type].push(listener)
return this
}
emit(type, ...args) {
if (this.#event[type] == undefined) return false
this.#event[type].forEach(fn => {
Reflect.apply(fn, this, args)
})
return true
}
once(type, listener) {
const onceFn = (...args) => {
listener(...args)
this.off(type, onceFn)
}
onceFn.origin = listener
return this.on(type, onceFn)
}
off(type, listener) {
if (this.#event[type] == undefined) return this
this.#event[type] = this.#event[type].filter(fn => {
return fn !== listener && fn.origin !== listener
})
if (this.#event[type].length === 0)
delete this.#event[type]
return this
}
removeAllListeners(type) {
if (type) delete this.#event[type]
else this.#event = Object.create(null)
return this
}
listeners(type) {
return this.#event[type]
}
}