add support for progress notifications in abortable operation

This commit is contained in:
Bruno Windels 2022-01-26 15:18:23 +01:00
parent 524090e27d
commit 554aa45d48

View file

@ -14,27 +14,40 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import {BaseObservableValue, ObservableValue} from "../observable/ObservableValue";
export interface IAbortable { export interface IAbortable {
abort(); abort();
} }
type RunFn<T> = (setAbortable: (a: IAbortable) => typeof a) => T; export type SetAbortableFn = (a: IAbortable) => typeof a;
export type SetProgressFn<P> = (progress: P) => void;
type RunFn<T, P> = (setAbortable: SetAbortableFn, setProgress: SetProgressFn<P>) => T;
export class AbortableOperation<T> { export class AbortableOperation<T, P = void> implements IAbortable {
public readonly result: T; public readonly result: T;
private _abortable: IAbortable | null; private _abortable?: IAbortable;
private _progress: ObservableValue<P | undefined>;
constructor(run: RunFn<T>) { constructor(run: RunFn<T, P>) {
this._abortable = null; this._abortable = undefined;
const setAbortable = abortable => { const setAbortable: SetAbortableFn = abortable => {
this._abortable = abortable; this._abortable = abortable;
return abortable; return abortable;
}; };
this.result = run(setAbortable); this._progress = new ObservableValue<P | undefined>(undefined);
const setProgress: SetProgressFn<P> = (progress: P) => {
this._progress.set(progress);
};
this.result = run(setAbortable, setProgress);
}
get progress(): BaseObservableValue<P | undefined> {
return this._progress;
} }
abort() { abort() {
this._abortable?.abort(); this._abortable?.abort();
this._abortable = null; this._abortable = undefined;
} }
} }