@@ -7,11 +7,11 @@ import { isThenable } from './is';
77/** SyncPromise internal states */
88const enum States {
99 /** Pending */
10- PENDING = 'PENDING' ,
10+ PENDING = 0 ,
1111 /** Resolved / OK */
12- RESOLVED = 'RESOLVED' ,
12+ RESOLVED = 1 ,
1313 /** Rejected / Error */
14- REJECTED = 'REJECTED' ,
14+ REJECTED = 2 ,
1515}
1616
1717/**
@@ -20,11 +20,7 @@ const enum States {
2020 */
2121class SyncPromise < T > implements PromiseLike < T > {
2222 private _state : States = States . PENDING ;
23- private _handlers : Array < {
24- done : boolean ;
25- onfulfilled ?: ( ( value : T ) => T | PromiseLike < T > ) | null ;
26- onrejected ?: ( ( reason : any ) => any ) | null ;
27- } > = [ ] ;
23+ private _handlers : Array < [ boolean , ( value : T ) => void , ( reason : any ) => any ] > = [ ] ;
2824 private _value : any ;
2925
3026 public constructor (
@@ -51,75 +47,40 @@ class SyncPromise<T> implements PromiseLike<T> {
5147 } ) ;
5248 }
5349
54- /** JSDoc */
55- public static all < U = any > ( collection : Array < U | PromiseLike < U > > ) : PromiseLike < U [ ] > {
56- return new SyncPromise < U [ ] > ( ( resolve , reject ) => {
57- if ( ! Array . isArray ( collection ) ) {
58- reject ( new TypeError ( `Promise.all requires an array as input.` ) ) ;
59- return ;
60- }
61-
62- if ( collection . length === 0 ) {
63- resolve ( [ ] ) ;
64- return ;
65- }
66-
67- let counter = collection . length ;
68- const resolvedCollection : U [ ] = [ ] ;
69-
70- collection . forEach ( ( item , index ) => {
71- void SyncPromise . resolve ( item )
72- . then ( value => {
73- resolvedCollection [ index ] = value ;
74- counter -= 1 ;
75-
76- if ( counter !== 0 ) {
77- return ;
78- }
79- resolve ( resolvedCollection ) ;
80- } )
81- . then ( null , reject ) ;
82- } ) ;
83- } ) ;
84- }
85-
8650 /** JSDoc */
8751 public then < TResult1 = T , TResult2 = never > (
8852 onfulfilled ?: ( ( value : T ) => TResult1 | PromiseLike < TResult1 > ) | null ,
8953 onrejected ?: ( ( reason : any ) => TResult2 | PromiseLike < TResult2 > ) | null ,
9054 ) : PromiseLike < TResult1 | TResult2 > {
9155 return new SyncPromise ( ( resolve , reject ) => {
92- this . _attachHandler ( {
93- done : false ,
94- onfulfilled : result => {
56+ this . _handlers . push ( [
57+ false ,
58+ result => {
9559 if ( ! onfulfilled ) {
9660 // TODO: ¯\_(ツ)_/¯
9761 // TODO: FIXME
9862 resolve ( result as any ) ;
99- return ;
100- }
101- try {
102- resolve ( onfulfilled ( result ) ) ;
103- return ;
104- } catch ( e ) {
105- reject ( e ) ;
106- return ;
63+ } else {
64+ try {
65+ resolve ( onfulfilled ( result ) ) ;
66+ } catch ( e ) {
67+ reject ( e ) ;
68+ }
10769 }
10870 } ,
109- onrejected : reason => {
71+ reason => {
11072 if ( ! onrejected ) {
11173 reject ( reason ) ;
112- return ;
113- }
114- try {
115- resolve ( onrejected ( reason ) ) ;
116- return ;
117- } catch ( e ) {
118- reject ( e ) ;
119- return ;
74+ } else {
75+ try {
76+ resolve ( onrejected ( reason ) ) ;
77+ } catch ( e ) {
78+ reject ( e ) ;
79+ }
12080 }
12181 } ,
122- } ) ;
82+ ] ) ;
83+ this . _executeHandlers ( ) ;
12384 } ) ;
12485 }
12586
@@ -162,11 +123,6 @@ class SyncPromise<T> implements PromiseLike<T> {
162123 } ) ;
163124 }
164125
165- /** JSDoc */
166- public toString ( ) : string {
167- return '[object SyncPromise]' ;
168- }
169-
170126 /** JSDoc */
171127 private readonly _resolve = ( value ?: T | PromiseLike < T > | null ) => {
172128 this . _setResult ( States . RESOLVED , value ) ;
@@ -194,20 +150,6 @@ class SyncPromise<T> implements PromiseLike<T> {
194150 this . _executeHandlers ( ) ;
195151 } ;
196152
197- // TODO: FIXME
198- /** JSDoc */
199- private readonly _attachHandler = ( handler : {
200- /** JSDoc */
201- done : boolean ;
202- /** JSDoc */
203- onfulfilled ?( value : T ) : any ;
204- /** JSDoc */
205- onrejected ?( reason : any ) : any ;
206- } ) => {
207- this . _handlers = this . _handlers . concat ( handler ) ;
208- this . _executeHandlers ( ) ;
209- } ;
210-
211153 /** JSDoc */
212154 private readonly _executeHandlers = ( ) => {
213155 if ( this . _state === States . PENDING ) {
@@ -218,24 +160,20 @@ class SyncPromise<T> implements PromiseLike<T> {
218160 this . _handlers = [ ] ;
219161
220162 cachedHandlers . forEach ( handler => {
221- if ( handler . done ) {
163+ if ( handler [ 0 ] ) {
222164 return ;
223165 }
224166
225167 if ( this . _state === States . RESOLVED ) {
226- if ( handler . onfulfilled ) {
227- // eslint-disable-next-line @typescript-eslint/no-floating-promises
228- handler . onfulfilled ( ( this . _value as unknown ) as any ) ;
229- }
168+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
169+ handler [ 1 ] ( ( this . _value as unknown ) as any ) ;
230170 }
231171
232172 if ( this . _state === States . REJECTED ) {
233- if ( handler . onrejected ) {
234- handler . onrejected ( this . _value ) ;
235- }
173+ handler [ 2 ] ( this . _value ) ;
236174 }
237175
238- handler . done = true ;
176+ handler [ 0 ] = true ;
239177 } ) ;
240178 } ;
241179}
0 commit comments