File tree Expand file tree Collapse file tree 1 file changed +22
-0
lines changed
Expand file tree Collapse file tree 1 file changed +22
-0
lines changed Original file line number Diff line number Diff line change 1+ // Simple event emitter for app-wide events
2+ type EventHandler = ( ...args : unknown [ ] ) => void ;
3+ class EventEmitter {
4+ private events : Map < string , EventHandler [ ] > = new Map ( ) ;
5+ on ( event : string , handler : EventHandler ) : ( ) => void {
6+ if ( ! this . events . has ( event ) ) this . events . set ( event , [ ] ) ;
7+ this . events . get ( event ) ! . push ( handler ) ;
8+ return ( ) => this . off ( event , handler ) ;
9+ }
10+ off ( event : string , handler : EventHandler ) : void {
11+ const handlers = this . events . get ( event ) ;
12+ if ( handlers ) this . events . set ( event , handlers . filter ( h => h !== handler ) ) ;
13+ }
14+ emit ( event : string , ...args : unknown [ ] ) : void {
15+ this . events . get ( event ) ?. forEach ( handler => handler ( ...args ) ) ;
16+ }
17+ once ( event : string , handler : EventHandler ) : void {
18+ const wrapper = ( ...args : unknown [ ] ) => { handler ( ...args ) ; this . off ( event , wrapper ) ; } ;
19+ this . on ( event , wrapper ) ;
20+ }
21+ }
22+ export const appEvents = new EventEmitter ( ) ;
You can’t perform that action at this time.
0 commit comments