Files
Bubberstation/tgui/packages/common/events.ts
SkyratBot b215646850 [MIRROR] Tgui: Events & Colors in typescript (#27754)
* Tgui: Events & Colors in typescript (#83218)

## About The Pull Request
Made more common tgui bits in typescript with tests. Not much else to
see here
## Why It's Good For The Game
Typescript conversion + More documentation + type safety

You now get full docs and type info as nature intended:

![image](https://github.com/tgstation/tgstation/assets/42397676/17a7aad6-56d3-4e22-89fa-585cda4c5315)

---------

Co-authored-by: Style Mistake <stylemistake@ gmail.com>

* Tgui: Events & Colors in typescript

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Style Mistake <stylemistake@ gmail.com>
2024-05-18 02:30:15 +02:00

46 lines
989 B
TypeScript

/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
*/
type Fn = (...args: any[]) => void;
export class EventEmitter {
private listeners: Record<string, Fn[]>;
constructor() {
this.listeners = {};
}
on(name: string, listener: Fn): void {
this.listeners[name] = this.listeners[name] || [];
this.listeners[name].push(listener);
}
off(name: string, listener: Fn): void {
const listeners = this.listeners[name];
if (!listeners) {
throw new Error(`There is no listeners for "${name}"`);
}
this.listeners[name] = listeners.filter((existingListener) => {
return existingListener !== listener;
});
}
emit(name: string, ...params: any[]): void {
const listeners = this.listeners[name];
if (!listeners) {
return;
}
for (let i = 0, len = listeners.length; i < len; i += 1) {
const listener = listeners[i];
listener(...params);
}
}
clear(): void {
this.listeners = {};
}
}