UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

94 lines 6.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GeneratorExtractor = void 0; const model_react_1 = require("model-react"); /** * A class used to extract items from a (custom) generator */ class GeneratorExtractor { /** * Creates a new generator extractor which extract a continuous stream of items * @param generator The generator to extract the items from * @param itemCallback The callback to forward the extracted items to */ constructor(generator) { this.started = new model_react_1.Field(false); this.stopped = new model_react_1.Field(false); this.sentStopSignal = false; this.generator = generator; } // Controls /** * Extracts the next item of */ next() { if (this.stopped.get()) return Promise.resolve(undefined); const returnPromise = new Promise(res => { this.itemCallback = res; }); if (!this.started.get()) { // If extraction hasn't started yet, start it this.started.set(true); this.generatorResult = this.generator(item => { if (!this.stopped.get()) { // As long as we haven't stopped, return the item if (this.itemCallback) { this.itemCallback(item); this.itemCallback = null; } return new Promise(res => (this.continueExtraction = res)); } else if (!this.sentStopSignal) { // When extraction stopped, first send a promise indicating it was stopped return Promise.resolve(true); } else { // When extraction stopped and the generator was informed, return a promise that never resolves return new Promise(() => { }); // A promise that never resolves } }).then(() => { this.stopped.set(true); if (this.itemCallback) { this.itemCallback(undefined); this.itemCallback = null; } }); } else if (this.continueExtraction) { this.continueExtraction(false); this.continueExtraction = null; } return returnPromise; } /** * Stops item extraction, which can't be continued later */ stop() { this.stopped.set(true); if (this.continueExtraction) { this.sentStopSignal = true; this.continueExtraction(true); this.continueExtraction = null; } } // State getters /** * Retrieves whether the item extraction has started * @param hook The hook to subscribe to changes * @returns Whether started */ hasStarted(hook) { return this.started.get(hook); } /** * Retrieves whether all items were extracted from the generator * @param hook The hook to subscribe to changes * @returns Whether the generator extracted all items, or the extractor was stopped */ hasFinished(hook) { return this.stopped.get(hook); } } exports.GeneratorExtractor = GeneratorExtractor; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuZXJhdG9yRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2dlbmVyYXRvci9HZW5lcmF0b3JFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQTZDO0FBRTdDOztHQUVHO0FBQ0gsTUFBYSxrQkFBa0I7SUFhM0I7Ozs7T0FJRztJQUNILFlBQW1CLFNBQXdCO1FBZmpDLFlBQU8sR0FBRyxJQUFJLG1CQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsWUFBTyxHQUFHLElBQUksbUJBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUczQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQVl0QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsV0FBVztJQUNYOztPQUVHO0lBQ0ksSUFBSTtRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQVcsR0FBRyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNyQiw2Q0FBNkM7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDckIsaURBQWlEO29CQUNqRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7d0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO3FCQUM1QjtvQkFDRCxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDOUQ7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQzdCLDBFQUEwRTtvQkFDMUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoQztxQkFBTTtvQkFDSCwrRkFBK0Y7b0JBQy9GLE9BQU8sSUFBSSxPQUFPLENBQVEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7aUJBQ3hFO1lBQ0wsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztpQkFDNUI7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDbEM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCOzs7O09BSUc7SUFDSSxVQUFVLENBQUMsSUFBZ0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxJQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDSjtBQWhHRCxnREFnR0MifQ==