Path: blob/main/extensions/copilot/test/taskRunner.ts
13383 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4class CTask<T> {56private resolve!: (value: T) => void;7private reject!: (err: any) => void;8public result: Promise<T>;910constructor(private readonly _execute: () => Promise<T>) {11this.result = new Promise<T>((resolve, reject) => {12this.resolve = resolve;13this.reject = reject;14});15}1617async execute(): Promise<void> {18try {19const result = await this._execute();20this.resolve(result);21} catch (err) {22this.reject(err);23}24}25}2627export class TaskRunner {28private readonly tasks: CTask<any>[] = [];29private pendingTasks = 0;3031private waitResolve: (() => void) | undefined;32// private waitPromise: Promise<void> | undefined;33constructor(34public readonly parallelism: number35) { }3637run<T>(task: CTask<T> | (() => Promise<T>)): Promise<T> {38if (!(task instanceof CTask)) {39task = new CTask(task);40}41this.tasks.push(task);42this.launchTaskIfPossible();43return task.result;44}4546private launchTaskIfPossible(): void {47if (this.tasks.length === 0) {48// all tasks completed49return;50}51if (this.pendingTasks >= this.parallelism) {52// too many tasks running53return;54}55const task = this.tasks.shift()!;56this.pendingTasks++;57task.execute().then(() => this.onDidCompleteTask(), () => this.onDidCompleteTask());58}5960private onDidCompleteTask(): void {61this.pendingTasks--;62this.launchTaskIfPossible();6364if (this.pendingTasks === 0) {65// all tasks completed66// this.waitPromise = undefined;67this.waitResolve?.();68}69}7071async waitForCompletion(): Promise<void> {72throw new Error('not implemented');73// if (!this.waitPromise) {74// this.waitPromise = new Promise<void>(resolve => this.waitResolve = resolve);75// }76// // for (let i = 0; i < this.parallelism; i++) {77// // this.launchTaskIfPossible();78// // }79// return this.waitPromise;80}81}828384