UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

111 lines 9.64 kB
"use strict"; 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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