@@ -8,29 +8,49 @@ export function createEventEmitter<
88> ( ) : EventEmitter < Events > {
99 const _listeners : Partial < { [ E in keyof Events ] : Events [ E ] [ ] } > = { }
1010
11+ function emit < K extends keyof Events > (
12+ event : K ,
13+ ...args : Parameters < Events [ K ] >
14+ ) {
15+ const callbacks = _listeners [ event ] || [ ]
16+ for ( let i = 0 , length = callbacks . length ; i < length ; i ++ ) {
17+ const callback = callbacks [ i ]
18+ if ( callback )
19+ callback ( ...args )
20+ }
21+ }
22+ function emitOnce < K extends keyof Events > (
23+ event : K ,
24+ ...args : Parameters < Events [ K ] >
25+ ) {
26+ emit ( event , ...args )
27+ delete _listeners [ event ]
28+ }
29+ function on < K extends keyof Events > (
30+ event : K ,
31+ cb : Events [ K ] ,
32+ ) : EventUnsubscribe {
33+ ; ( _listeners [ event ] ||= [ ] as Events [ K ] [ ] ) . push ( cb )
34+ return ( ) => {
35+ _listeners [ event ] = _listeners [ event ] ?. filter ( i => cb !== i ) as Events [ K ] [ ] | undefined
36+ }
37+ }
38+ function once < K extends keyof Events > (
39+ event : K ,
40+ cb : Events [ K ] ,
41+ ) {
42+ const unsubscribe = on ( event , ( ( ...args : Parameters < Events [ K ] > ) => {
43+ unsubscribe ( )
44+ return cb ( ...args )
45+ } ) as Events [ K ] )
46+ return unsubscribe
47+ }
48+
1149 return {
12- emit < K extends keyof Events > (
13- this : EventEmitter < Events > ,
14- event : K ,
15- ...args : Parameters < Events [ K ] >
16- ) {
17- const callbacks = _listeners [ event ] || [ ]
18- for ( let i = 0 , length = callbacks . length ; i < length ; i ++ ) {
19- const callback = callbacks [ i ]
20- if ( callback )
21- callback ( ...args )
22- }
23- } ,
2450 _listeners,
25- on < K extends keyof Events > (
26- this : EventEmitter < Events > ,
27- event : K ,
28- cb : Events [ K ] ,
29- ) : EventUnsubscribe {
30- ; ( _listeners [ event ] ||= [ ] as Events [ K ] [ ] ) . push ( cb )
31- return ( ) => {
32- _listeners [ event ] = _listeners [ event ] ?. filter ( i => cb !== i ) as Events [ K ] [ ] | undefined
33- }
34- } ,
51+ emit,
52+ emitOnce,
53+ on,
54+ once,
3555 }
3656}
0 commit comments