@@ -6,15 +6,42 @@ export interface Observer<T = any> {
66 complete ( ) : void ;
77}
88
9+ export interface Subscription {
10+ unsubscribe ( ) : void ;
11+ readonly closed : boolean ;
12+ }
13+
14+ export interface Subscribable < T = any > {
15+ [ Symbol . observable ] ( ) : Subscribable < T > ;
16+ subscribe (
17+ onNext : Observer < T > [ 'next' ] ,
18+ onError ?: Observer < T > [ 'error' ] ,
19+ onComplete ?: Observer < T > [ 'complete' ]
20+ ) : Subscription ;
21+ }
22+
923export type SubscriberFunction = ( observer : Observer ) => ( ( ) => void ) | void ;
1024
11- export class Observable < T = any > {
25+ export type EventHandler = ( data : any ) => void ;
26+
27+ export interface EventTrigger {
28+ addEventListener ?( name : string , handler : EventHandler ) : void ;
29+ removeEventListener ?( name : string , handler : EventHandler ) : void ;
30+ on ?( name : string , handler : EventHandler ) : this;
31+ off ?( name : string , handler : EventHandler ) : this;
32+ }
33+
34+ export class Observable < T = any > implements Subscribable {
1235 private subscriber : SubscriberFunction ;
1336
1437 constructor ( subscriber : SubscriberFunction ) {
1538 this . subscriber = subscriber ;
1639 }
1740
41+ [ Symbol . observable ] ( ) {
42+ return this ;
43+ }
44+
1845 async * [ Symbol . asyncIterator ] ( ) {
1946 var queue : Defer < T > [ ] = [ makeDefer < T > ( ) ] ,
2047 canceler : ( ( ) => void ) | void ,
@@ -58,6 +85,18 @@ export class Observable<T = any> {
5885 } ) ;
5986 }
6087
88+ async toPromise ( ) {
89+ const stack = [ ] ;
90+
91+ for await ( const item of this ) {
92+ stack . push ( item ) ;
93+
94+ if ( stack . length > 2 ) stack . shift ( ) ;
95+ }
96+
97+ return stack [ 0 ] ;
98+ }
99+
61100 subscribe (
62101 onNext : Observer < T > [ 'next' ] ,
63102 onError ?: Observer < T > [ 'error' ] ,
@@ -87,10 +126,30 @@ export class Observable<T = any> {
87126 } ;
88127 }
89128
90- static from < T = any > ( observable : Observable < T > ) {
129+ static from < T = any > ( observable : Subscribable < T > ) {
91130 return new this < T > (
92131 ( { next, error, complete } ) =>
93132 observable . subscribe ( next , error , complete ) . unsubscribe
94133 ) ;
95134 }
135+
136+ static fromEvent < T = any > ( target : EventTrigger , name : string ) {
137+ return new this < T > ( ( { next, error } ) => {
138+ if ( typeof target . on === 'function' )
139+ target . on ( name , next ) . on ( 'error' , error ) ;
140+ else {
141+ target . addEventListener ( name , next ) ;
142+ target . addEventListener ( 'error' , error ) ;
143+ }
144+
145+ return ( ) => {
146+ if ( typeof target . off === 'function' )
147+ target . off ( name , next ) . off ( 'error' , error ) ;
148+ else {
149+ target . removeEventListener ( name , next ) ;
150+ target . removeEventListener ( 'error' , error ) ;
151+ }
152+ } ;
153+ } ) ;
154+ }
96155}
0 commit comments