@launchmenu/core
Version:
An environment for visual keyboard controlled applets
92 lines • 7.11 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.createActionHandlerTree = exports.createActionGraph = void 0;
const getHooked_1 = require("../../utils/subscribables/getHooked");
/**
* Creates a new action graph
* @param targets The targets to retrieve all bindings and actions from
* @param hook The data hook to subscribe to changes
* @param collectTargets Whether to also collect the target per node
* @returns The action graph
*/
function createActionGraph(targets, hook, collectTargets) {
// Retrieve all actions and their bindings
const actionBindings = [];
let index = 0;
targets.forEach(target => {
const bindings = getHooked_1.getHooked(target.actionBindings, hook);
bindings.forEach(binding => {
const action = actionBindings.find(({ action }) => action == binding.action);
// Do some extra work when the target data is also requested
if (collectTargets) {
if (action) {
action.bindings.push({ ...binding, index });
if (!action.targets.includes(target))
action.targets.push(target);
}
else
actionBindings.push({
action: binding.action,
bindings: [{ ...binding, index }],
targets: [target],
});
}
else {
// Ignore the targets if not requested for slightly better performance
if (action)
action.bindings.push({ ...binding, index });
else
actionBindings.push({
action: binding.action,
bindings: [{ ...binding, index }],
targets: [],
});
}
index++;
});
});
// Create nodes for the actions
const nodes = actionBindings.map(actionBindings => ({
...actionBindings,
children: [],
}));
// Add all children to the nodes
for (let i = 0; i < nodes.length; i++) {
const actionNode = nodes[i];
actionNode.action.parents.forEach(p => {
const parentNode = nodes.find(({ action }) => action == p);
if (parentNode)
parentNode.children.push(actionNode);
else
nodes.push({
action: p,
bindings: [],
targets: [],
children: [actionNode],
});
});
}
return nodes;
}
exports.createActionGraph = createActionGraph;
/**
* Creates a new action handler tree for the given action. Note, it's not actually a fully proper tree, the same node may appear in the tree multiple times, so it's more like a DAG with a single source.
* @param rootAction The action to create the handler graph for
* @param targets The targets to retrieve all bindings and handlers from
* @param hook The data hook to subscribe to changes
* @param collectTargets Whether to also collect the target per node
* @returns The action handler tree
*/
function createActionHandlerTree(rootAction, targets, hook, collectTargets) {
const nodes = createActionGraph(targets, hook, collectTargets);
// Return the root node, with a fallback in case no targets have a binding for this action
const fallback = {
action: rootAction,
children: [],
bindings: [],
targets: [],
};
return nodes.find(({ action }) => action == rootAction) || fallback;
}
exports.createActionHandlerTree = createActionHandlerTree;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQWN0aW9uSGFuZGxlclRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWN0aW9ucy9hY3Rpb25HcmFwaC9jcmVhdGVBY3Rpb25IYW5kbGVyVHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtRUFBOEQ7QUFNOUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQzdCLE9BQXdCLEVBQ3hCLElBQWdCLEVBQ2hCLGNBQWtCO0lBRWxCLDBDQUEwQztJQUMxQyxNQUFNLGNBQWMsR0FJZCxFQUFFLENBQUM7SUFDVCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4RCxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTNFLDREQUE0RDtZQUM1RCxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO29CQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO3dCQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyRTs7b0JBQ0csY0FBYyxDQUFDLElBQUksQ0FBQzt3QkFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO3dCQUN0QixRQUFRLEVB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
;