useShuffle.ts 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. function shuffleArray(array) {
  2. for (let i = array.length - 1; i > 0; i--) {
  3. const j = Math.floor(Math.random() * (i + 1));
  4. [array[i], array[j]] = [array[j], array[i]];
  5. }
  6. }
  7. function generatePossibleEdges(nodes) {
  8. const possibleEdges = [];
  9. for (const sourceNode of nodes) {
  10. for (const targetNode of nodes) {
  11. if (sourceNode.id !== targetNode.id) {
  12. const edgeId = `e${sourceNode.id}-${targetNode.id}`;
  13. possibleEdges.push({
  14. id: edgeId,
  15. source: sourceNode.id,
  16. target: targetNode.id,
  17. type: "animation",
  18. animated: true
  19. });
  20. }
  21. }
  22. }
  23. return possibleEdges;
  24. }
  25. export function useShuffle() {
  26. return nodes => {
  27. const possibleEdges = generatePossibleEdges(nodes);
  28. shuffleArray(possibleEdges);
  29. const usedNodes = new Set();
  30. const newEdges = [];
  31. for (const edge of possibleEdges) {
  32. if (
  33. !usedNodes.has(edge.target) &&
  34. (usedNodes.size === 0 || usedNodes.has(edge.source))
  35. ) {
  36. newEdges.push(edge);
  37. usedNodes.add(edge.source);
  38. usedNodes.add(edge.target);
  39. }
  40. }
  41. return newEdges;
  42. };
  43. }