@launchmenu/core
Version:
An environment for visual keyboard controlled applets
83 lines • 6.22 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.CompoundCommand = void 0;
const model_react_1 = require("model-react");
/** A standard command that can be used to combine commands to execute and undo them together */
class CompoundCommand {
constructor(metadata, commands) {
var _a;
// Obtains the state data and caches it, only recalculating it if requested and any of the dependencies changed
this.stateGetter = new model_react_1.DataCacher(hook => {
const states = this.commands.map(command => command.getState(hook));
// Obtain the changed states compared to the previous iteration
const sc = {
executing: 0,
preparingForExecution: 0,
executed: 0,
reverting: 0,
ready: 0,
preparingForRevert: 0,
};
states.forEach(state => (sc[state] += 1));
// Decide what the overall state should be
let newState;
if (sc.executing > 0 || sc.reverting > 0) {
if (sc.executing > sc.reverting)
newState = "executing";
else
newState = "reverting";
}
else if (sc.preparingForExecution > 0 || sc.preparingForRevert > 0) {
if (sc.preparingForExecution > sc.preparingForRevert)
newState = "preparingForExecution";
else
newState = "preparingForRevert";
}
else {
if (sc.ready > sc.executed)
newState = "ready";
else
newState = "executed";
}
return { overall: newState, commands: states };
});
if (!commands && metadata instanceof Array) {
commands = metadata;
metadata = ((_a = commands[0]) === null || _a === void 0 ? void 0 : _a.metadata) || { name: "Compound Command" };
}
this.commands = commands;
this.metadata = metadata;
}
/**
* Retrieves a new compound command that's equivalent to this command with the specified command added
* @param command The command to add
* @returns The new compound command
*/
augment(command) {
return new CompoundCommand(this.metadata, [...this.commands, command]);
}
/**
* Executes the compound command
* @returns A promise that resolves once all subcommands finished executing
*/
async execute() {
await Promise.all(this.commands.map(command => command.execute()));
}
/**
* Reverts the compound command
* @returns A promise that resolves once all subcommands finished executing
*/
async revert() {
await Promise.all([...this.commands].reverse().map(command => command.revert()));
}
/**
* Retrieves the state of the compound command. Combining the data of the child commands.
* @param hook The hook to subscribe to changes
* @returns The state of this command
*/
getState(hook) {
return this.stateGetter.get(hook).overall;
}
}
exports.CompoundCommand = CompoundCommand;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG91bmRDb21tYW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3VuZG9SZWRvL2NvbW1hbmRzL0NvbXBvdW5kQ29tbWFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2Q0FBa0Q7QUFJbEQsZ0dBQWdHO0FBQ2hHLE1BQWEsZUFBZTtJQWV4QixZQUFtQixRQUF1QyxFQUFFLFFBQXFCOztRQW1DakYsK0dBQStHO1FBQ3JHLGdCQUFXLEdBQUcsSUFBSSx3QkFBVSxDQUduQyxJQUFJLENBQUMsRUFBRTtZQUNOLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRXBFLCtEQUErRDtZQUMvRCxNQUFNLEVBQUUsR0FBRztnQkFDUCxTQUFTLEVBQUUsQ0FBQztnQkFDWixxQkFBcUIsRUFBRSxDQUFDO2dCQUN4QixRQUFRLEVBQUUsQ0FBQztnQkFDWCxTQUFTLEVBQUUsQ0FBQztnQkFDWixLQUFLLEVBQUUsQ0FBQztnQkFDUixrQkFBa0IsRUFBRSxDQUFDO2FBQ1UsQ0FBQztZQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxQywwQ0FBMEM7WUFDMUMsSUFBSSxRQUF1QixDQUFDO1lBQzVCLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksRUFBRSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUztvQkFBRSxRQUFRLEdBQUcsV0FBVyxDQUFDOztvQkFDbkQsUUFBUSxHQUFHLFdBQVcsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLEVBQUUsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFBRTtnQkFDbEUsSUFBSSxFQUFFLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDLGtCQUFrQjtvQkFDaEQsUUFBUSxHQUFHLHVCQUF1QixDQUFDOztvQkFDbEMsUUFBUSxHQUFHLG9CQUFvQixDQUFDO2FBQ3hDO2lCQUFNO2dCQUNILElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUTtvQkFBRSxRQUFRLEdBQUcsT0FBTyxDQUFDOztvQkFDMUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzthQUM5QjtZQUVELE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQW5FQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsWUFBWSxLQUFLLEVBQUU7WUFDeEMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNwQixRQUFRLEdBQUcsT0FBQSxRQUFRLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFFBQVEsS0FBSSxFQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFzQixDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBNEIsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxPQUFpQjtRQUM1QixPQUFPLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE9BQU87UUFDaEIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLE1BQU07UUFDZixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFxQ0Q7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxJQUFnQjtRQUM1QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM5QyxDQUFDO0NBQ0o7QUE3RkQsMENBNkZDIn0=
;