char/avril
(wip) why'd you have to go and make things so complicaaaaated?
git clone https://git.t4t.associates/char/avril
fdaf84e
main
1import { Promise } from "ext:core/primordials" ; 2import { markPromiseHandled , performPromiseThen } from "ext:core/promise_hooks" ; 3import { isPromise } from "ext:core/event_hooks" ; 4 5// A thenable avoids Await's PromiseResolve constructor lookup without changing the source. 6export function safePromise ( value ) { 7if ( ! isPromise ( value )) return value ; 8return { 9__proto__ :null , 10then ( resolve , reject ) { 11performPromiseThen ( value , resolve , reject ); 12}, 13}; 14} 15export function newPromise ( executor ) { 16return new Promise (( resolve , reject ) => 17executor (( value ) => resolve ( safePromise ( value )), reject ) 18); 19} 20export function promiseResolve ( value ) { 21return newPromise (( resolve ) => resolve ( value )); 22} 23export function promiseReject ( reason ) { 24return newPromise (( _resolve , reject ) => reject ( reason )); 25} 26export function promiseThen ( promise , fulfilled , rejected ) { 27return performPromiseThen ( 28isPromise ( promise ) ?promise :promiseResolve ( promise ), 29( value ) => 30safePromise ( typeof fulfilled === "function" ?fulfilled ( value ) :value ), 31( error ) => { 32if ( typeof rejected === "function" ) return safePromise ( rejected ( error )); 33throw error ; 34}, 35); 36} 37export function promiseAll ( values ) { 38return newPromise (( resolve , reject ) => { 39const results = [], count = values . length ; 40let remaining = count ; 41if ( ! remaining ) resolve ( results ); 42for ( let index = 0 ; index < count ; index ++ ) { 43promiseThen ( promiseResolve ( values [ index ]), ( value ) => { 44results [ index ] = value ; 45if ( !-- remaining ) resolve ( results ); 46}, reject ); 47} 48}); 49} 50export { markPromiseHandled };