@@ -18,7 +18,7 @@ const enum States {
1818 * Thenable class that behaves like a Promise and follows it's interface
1919 * but is not async internally
2020 */
21- class SyncPromise < T > implements PromiseLike < T > {
21+ export class SyncPromise < T > implements PromiseLike < T > {
2222 private _state : States = States . PENDING ;
2323 private _handlers : Array < [ boolean , ( value : T ) => void , ( reason : any ) => any ] > = [ ] ;
2424 private _value : any ;
@@ -35,16 +35,12 @@ class SyncPromise<T> implements PromiseLike<T> {
3535
3636 /** JSDoc */
3737 public static resolve < T > ( value : T | PromiseLike < T > ) : PromiseLike < T > {
38- return new SyncPromise ( resolve => {
39- resolve ( value ) ;
40- } ) ;
38+ return syncPromiseResolve ( value ) ;
4139 }
4240
4341 /** JSDoc */
4442 public static reject < T = never > ( reason ?: any ) : PromiseLike < T > {
45- return new SyncPromise ( ( _ , reject ) => {
46- reject ( reason ) ;
47- } ) ;
43+ return syncPromiseReject ( reason ) ;
4844 }
4945
5046 /** JSDoc */
@@ -178,4 +174,48 @@ class SyncPromise<T> implements PromiseLike<T> {
178174 } ;
179175}
180176
181- export { SyncPromise } ;
177+ /** JSDoc */
178+ export function syncPromiseResolve < T > ( value : T | PromiseLike < T > ) : PromiseLike < T > {
179+ return new SyncPromise ( resolve => {
180+ resolve ( value ) ;
181+ } ) ;
182+ }
183+
184+ /** JSDoc */
185+ export function syncPromiseReject < T = never > ( reason ?: any ) : PromiseLike < T > {
186+ return new SyncPromise ( ( _ , reject ) => {
187+ reject ( reason ) ;
188+ } ) ;
189+ }
190+
191+ /** JSDoc */
192+ export function syncPromiseAll < U = any > ( collection : Array < U | PromiseLike < U > > ) : PromiseLike < U [ ] > {
193+ return new SyncPromise < U [ ] > ( ( resolve , reject ) => {
194+ if ( ! Array . isArray ( collection ) ) {
195+ reject ( new TypeError ( `Promise.all requires an array as input.` ) ) ;
196+ return ;
197+ }
198+
199+ if ( collection . length === 0 ) {
200+ resolve ( [ ] ) ;
201+ return ;
202+ }
203+
204+ let counter = collection . length ;
205+ const resolvedCollection : U [ ] = [ ] ;
206+
207+ collection . forEach ( ( item , index ) => {
208+ void syncPromiseResolve ( item )
209+ . then ( value => {
210+ resolvedCollection [ index ] = value ;
211+ counter -= 1 ;
212+
213+ if ( counter !== 0 ) {
214+ return ;
215+ }
216+ resolve ( resolvedCollection ) ;
217+ } )
218+ . then ( null , reject ) ;
219+ } ) ;
220+ } ) ;
221+ }
0 commit comments