export function race()

in src/SyncTasks.ts [627:691]


export function race<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
    values: [
        Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>, Raceable<T6>, Raceable<T7>, Raceable<T8>, Raceable<T9>
    ]
): STPromise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9>;

export function race<T1, T2, T3, T4, T5, T6, T7, T8>(
    values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>, Raceable<T6>, Raceable<T7>, Raceable<T8>]
): STPromise<T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8>;

export function race<T1, T2, T3, T4, T5, T6, T7>(
    values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>, Raceable<T6>, Raceable<T7>]
): STPromise<T1 | T2 | T3 | T4 | T5 | T6 | T7>;

export function race<T1, T2, T3, T4, T5, T6>(
    values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>, Raceable<T6>]
): STPromise<T1 | T2 | T3 | T4 | T5 | T6>;
export function race<T1, T2, T3, T4, T5>(
    values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>]): STPromise<T1|T2|T3|T4|T5>;

export function race<T1, T2, T3, T4>(values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>]): STPromise<T1|T2|T3|T4>;

export function race<T1, T2, T3>(values: [Raceable<T1>, Raceable<T2>, Raceable<T3>]): STPromise<T1|T2|T3>;

export function race<T1, T2>(values: [Raceable<T1>, Raceable<T2>]): STPromise<T1|T2>;

export function race<T>(values: (T | Thenable<T>)[]): STPromise<T[]>;

export function race(items: any[]): STPromise<any> {
    const outTask = Defer<any>();
    let hasSettled = false;

    outTask.onCancel((val) => {
        items.forEach(item => {
            if (isCancelable(item)) {
                Internal.SyncTask.cancelOtherInternal(item, val);
            }
        });
    });

    items.forEach(item => {
        if (isThenable(item)) {
            const task = item as Thenable<any>;
            task.then(res => {
                if (!hasSettled) {
                    hasSettled = true;
                    outTask.resolve(res);
                }
            }, err => {
                if (!hasSettled) {
                    hasSettled = true;
                    outTask.reject(err);
                }
            });
        } else {
            // Not a task, so resolve directly with the item
            if (!hasSettled) {
                hasSettled = true;
                outTask.resolve(item);
            }
        }
    });

    return outTask.promise();
}