@launchmenu/core
Version:
An environment for visual keyboard controlled applets
94 lines • 6.29 kB
JavaScript
"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==