@launchmenu/core
Version:
An environment for visual keyboard controlled applets
111 lines • 9.64 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getIndexedResult = exports.getBindingData = exports.getAllActionBindings = exports.reduceActions = void 0;
/**
* Obtains the result of the last action node, when all actions are reduced from left to right
* @param actions The actions and their bindings to reduce to a single result
* @param items The input items that actions can use to extract extra data
* @param hook The hook to subscribe to changes (when action bindings change their data)
* @param getActionResultIndex The function to use to decide how to order action handler bindings with other bindings
* @returns The result of the final action
*/
function reduceActions(actions, items, hook, getActionResultIndex = bindings => bindings[0] ? bindings[0].index : Infinity) {
var _a;
for (let i = 0; i < actions.length; i++) {
const node = actions[i];
// Get all input data for the action and obtain the result
const bindings = getAllActionBindings(node);
if (bindings.length == 0 && i != actions.length - 1)
continue; // Can happen if a handler decides to not create any bindings, but we always want to compute the final action
const inputs = bindings.map(binding => getBindingData(binding, hook));
const indices = bindings.map(binding => binding.index);
const result = node.action.transform(inputs, indices, hook, items);
// Add index data to the result's bindings
const combinedIndex = getActionResultIndex(bindings);
const indexedResult = getIndexedResult(result, indices, combinedIndex);
// Store the result of the action in the node
node.result = indexedResult;
}
return (_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.result;
}
exports.reduceActions = reduceActions;
/**
* Retrieves the action bindings given action, combining direct bindings and handler result bindings in the correct order
* @param actionNode The node to get the action inputs for
* @returns The inputs for the action of the given node
*/
function getAllActionBindings(actionNode) {
const bindings = [...actionNode.bindings];
const { action } = actionNode;
// Go through all handlers, and for each handler add the resulting binding in the correct index, if for this action
actionNode.children.forEach(child => {
var _a, _b;
(_b = (_a = child.result) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.forEach(parentBinding => {
if (parentBinding.action == action) {
// Insert the binding at the proper index
outer: {
for (let i = 0; i < bindings.length; i++) {
if (bindings[i].index > parentBinding.index) {
bindings.splice(i, 0, parentBinding);
break outer;
}
}
bindings.push(parentBinding);
}
}
});
});
// Return the resulting bindings
return bindings;
}
exports.getAllActionBindings = getAllActionBindings;
/**
* Retrieves the binding data for a given action binding
* @param binding The binding to retrieve the data of
* @param hook The data hook to subscribe to changes
* @returns The binding data
*/
function getBindingData(binding, hook) {
if ("data" in binding)
return binding.data;
else
return binding.subscribableData(hook);
}
exports.getBindingData = getBindingData;
/**
* Adds appropriate indexing data to all child bindings of this result
* @param actionResult The action result to add indexing to
* @param indices The indices of the inputs of this action
* @param combinedIndices The combined indices of the input
* @returns The indexed result
*/
function getIndexedResult(actionResult, indices, combinedIndices) {
var _a, _b;
// Get the indices object that checks what index we are at, and whether the binding count corresponds to the index count
const actionIndices = [];
(_a = actionResult.children) === null || _a === void 0 ? void 0 : _a.forEach(binding => {
const f = actionIndices.find(({ action }) => binding.action == action);
if (f)
f.count++;
else
actionIndices.push({ action: binding.action, count: 1, index: 0 });
});
// Map the indices
return {
...actionResult,
children: (_b = actionResult.children) === null || _b === void 0 ? void 0 : _b.map((binding) => {
if ("index" in binding && binding.index != undefined)
return binding;
// Default to the combined index
let index = combinedIndices;
// If the number of bindings for this action corresponds to the number of inputs, map it to the input indices
const f = actionIndices.find(({ action }) => binding.action == action);
if ((f === null || f === void 0 ? void 0 : f.count) == indices.length)
index = indices[f.index++];
// Return the binding with the index
return { ...binding, index };
}),
};
}
exports.getIndexedResult = getIndexedResult;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlQWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hY3Rpb25zL2FjdGlvbkdyYXBoL3JlZHVjZUFjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBUUE7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGFBQWEsQ0FDekIsT0FBc0IsRUFDdEIsS0FBc0IsRUFDdEIsSUFBZ0IsRUFDaEIsdUJBQXNFLFFBQVEsQ0FBQyxFQUFFLENBQzdFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUTs7SUFFOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhCLDBEQUEwRDtRQUMxRCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxTQUFTLENBQUMsNkdBQTZHO1FBQzVLLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDaEMsTUFBTSxFQUNOLE9BQU8sRUFDUCxJQUFJLEVBQ0osS0FBSyxDQUM4QixD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
;