UNPKG

rc-js-util

Version:

A collection of TS and C++ utilities to help writing performant and correct applications, achieved through strict typing and (removable) invariant checking.

70 lines 2.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IncrementalUpdater = void 0; const _debug_js_1 = require("../debug/_debug.js"); /** * @public * Performs update operations once every `waitPeriod` until the iterator returned by {@link IIncrementallyUpdatable} is * exhausted. */ class IncrementalUpdater { constructor(updatable, waitPeriod = 4) { this.updatable = updatable; this.waitPeriod = waitPeriod; /** * Remains true while the update is suspended. */ this.isUpdating = false; this.update = () => { var _a; (_a = this.currentIterator) !== null && _a !== void 0 ? _a : (this.currentIterator = this.updatable.incrementallyUpdate()); if (this.currentIterator.next().done === true) { this.currentIterator = null; this.id = null; this.isUpdating = false; } else { this.id = setTimeout(this.update, this.waitPeriod); } }; this.currentIterator = null; this.id = null; } /** * Cancel the update and clear the task. */ cancel() { if (this.id != null) { clearTimeout(this.id); this.id = null; this.isUpdating = false; } this.currentIterator = null; } /** * Suspends the current task if one is active. */ suspend() { if (this.id != null) { clearTimeout(this.id); this.id = null; } } /** * Start a new update cycle. If an update was already in progress it will be cancelled. */ beginUpdate() { this.cancel(); this.isUpdating = true; this.update(); } /** * Resumes the currently suspended task. It is an error to call this if there is not a currently suspended task. */ resume() { _BUILD.DEBUG && _debug_js_1._Debug.assert(this.isUpdating && this.id == null, "nothing to resume"); this.update(); } } exports.IncrementalUpdater = IncrementalUpdater; //# sourceMappingURL=incremental-updater.js.map