/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from './event.js'; var shortcutEvent = Object.freeze(function (callback, context) { var handle = setTimeout(callback.bind(context), 0); return { dispose: function () { clearTimeout(handle); } }; }); export var CancellationToken; (function (CancellationToken) { function isCancellationToken(thing) { if (thing === CancellationToken.None || thing === CancellationToken.Cancelled) { return true; } if (thing instanceof MutableToken) { return true; } if (!thing || typeof thing !== 'object') { return false; } return typeof thing.isCancellationRequested === 'boolean' && typeof thing.onCancellationRequested === 'function'; } CancellationToken.isCancellationToken = isCancellationToken; CancellationToken.None = Object.freeze({ isCancellationRequested: false, onCancellationRequested: Event.None }); CancellationToken.Cancelled = Object.freeze({ isCancellationRequested: true, onCancellationRequested: shortcutEvent }); })(CancellationToken || (CancellationToken = {})); var MutableToken = /** @class */ (function () { function MutableToken() { this._isCancelled = false; this._emitter = null; } MutableToken.prototype.cancel = function () { if (!this._isCancelled) { this._isCancelled = true; if (this._emitter) { this._emitter.fire(undefined); this.dispose(); } } }; Object.defineProperty(MutableToken.prototype, "isCancellationRequested", { get: function () { return this._isCancelled; }, enumerable: true, configurable: true }); Object.defineProperty(MutableToken.prototype, "onCancellationRequested", { get: function () { if (this._isCancelled) { return shortcutEvent; } if (!this._emitter) { this._emitter = new Emitter(); } return this._emitter.event; }, enumerable: true, configurable: true }); MutableToken.prototype.dispose = function () { if (this._emitter) { this._emitter.dispose(); this._emitter = null; } }; return MutableToken; }()); var CancellationTokenSource = /** @class */ (function () { function CancellationTokenSource(parent) { this._token = undefined; this._parentListener = undefined; this._parentListener = parent && parent.onCancellationRequested(this.cancel, this); } Object.defineProperty(CancellationTokenSource.prototype, "token", { get: function () { if (!this._token) { // be lazy and create the token only when // actually needed this._token = new MutableToken(); } return this._token; }, enumerable: true, configurable: true }); CancellationTokenSource.prototype.cancel = function () { if (!this._token) { // save an object by returning the default // cancelled token when cancellation happens // before someone asks for the token this._token = CancellationToken.Cancelled; } else if (this._token instanceof MutableToken) { // actually cancel this._token.cancel(); } }; CancellationTokenSource.prototype.dispose = function () { if (this._parentListener) { this._parentListener.dispose(); } if (!this._token) { // ensure to initialize with an empty token if we had none this._token = CancellationToken.None; } else if (this._token instanceof MutableToken) { // actually dispose this._token.dispose(); } }; return CancellationTokenSource; }()); export { CancellationTokenSource };