File tree Expand file tree Collapse file tree 1 file changed +45
-0
lines changed
Expand file tree Collapse file tree 1 file changed +45
-0
lines changed Original file line number Diff line number Diff line change 1+ export interface Listener < T > {
2+ ( event : T ) : any ;
3+ }
4+
5+ export interface Disposable {
6+ dispose ( ) ;
7+ }
8+
9+ /** passes through events as they happen. You will not get events from before you start listening */
10+ export class TypedEvent < T > {
11+ private listeners : Listener < T > [ ] = [ ] ;
12+ private listenersOncer : Listener < T > [ ] = [ ] ;
13+
14+ on = ( listener : Listener < T > ) : Disposable => {
15+ this . listeners . push ( listener ) ;
16+ return {
17+ dispose : ( ) => this . off ( listener )
18+ } ;
19+ }
20+
21+ once = ( listener : Listener < T > ) : void => {
22+ this . listenersOncer . push ( listener ) ;
23+ }
24+
25+ off = ( listener : Listener < T > ) => {
26+ var callbackIndex = this . listeners . indexOf ( listener ) ;
27+ if ( callbackIndex > - 1 ) this . listeners . splice ( callbackIndex , 1 ) ;
28+ }
29+
30+ emit = ( event : T ) => {
31+ /** Update any general listeners */
32+ this . listeners . forEach ( ( listener ) => listener ( event ) ) ;
33+
34+ /** Clear the `once` queue */
35+ if ( this . listenersOncer . length > 0 ) {
36+ const toCall = this . listenersOncer ;
37+ this . listenersOncer = [ ] ;
38+ toCall . forEach ( ( listener ) => listener ( event ) ) ;
39+ }
40+ }
41+
42+ pipe = ( te : TypedEvent < T > ) : Disposable => {
43+ return this . on ( ( e ) => te . emit ( e ) ) ;
44+ }
45+ }
You can’t perform that action at this time.
0 commit comments