Files
vue-flow/docs/examples/layout/useShuffle.js
2024-02-08 22:39:01 +01:00

49 lines
1.4 KiB
JavaScript

function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1))
;[array[i], array[j]] = [array[j], array[i]]
}
}
// generate a list of all possible edges, excluding duplicates and self-references
function generatePossibleEdges(nodes) {
const possibleEdges = []
for (const sourceNode of nodes) {
for (const targetNode of nodes) {
if (sourceNode.id !== targetNode.id) {
const edgeId = `e${sourceNode.id}-${targetNode.id}`
possibleEdges.push({ id: edgeId, source: sourceNode.id, target: targetNode.id, type: 'animation', animated: true })
}
}
}
return possibleEdges
}
/**
* Composable that returns a function to shuffle the edges of a graph
*
* @returns {Function} A function that takes a list of nodes and returns a list of edges
*/
export function useShuffle() {
return (nodes) => {
const possibleEdges = generatePossibleEdges(nodes)
shuffleArray(possibleEdges)
const usedNodes = new Set()
const newEdges = []
// ensure every node is used, maintaining a single starting node and no duplicate connections
for (const edge of possibleEdges) {
if (!usedNodes.has(edge.target) && (usedNodes.size === 0 || usedNodes.has(edge.source))) {
newEdges.push(edge)
usedNodes.add(edge.source)
usedNodes.add(edge.target)
}
}
return newEdges
}
}