Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. class GraphRouter {
  2. constructor(state) {
  3. this.vertices = {};
  4. this.sortedVerticies = [];
  5. this.visitedVerticies = [];
  6. }
  7.  
  8. addNode(path, dependencies, resolve) {
  9. const vertex = {
  10. name: path.split('/').pop(),
  11. path,
  12. edges: dependencies,
  13. resolve,
  14. };
  15. this.vertices[path] = vertex;
  16. }
  17.  
  18. _visitForSort(vertex) {
  19. if (this.visitedVerticies[vertex.path] === 2) return;
  20. if (this.visitedVerticies[vertex.path] === 1) throw new Error(`CYCLE FOUND AT ${vertex}`);
  21.  
  22. this.visitedVerticies[vertex.path] = 1;
  23. vertex.edges.length && vertex.edges.map((v) => this._visitForSort(this.vertices[v]));
  24. this.visitedVerticies[vertex.path] = 2;
  25. this.sortedVerticies.push(vertex);
  26. }
  27.  
  28. sort() {
  29. // Reverse topological sort
  30. this.sortedVerticies = [];
  31. this.visitedVerticies = [];
  32. const vertices = Object.values(this.vertices);
  33. while (vertices.length > 0) {
  34. this._visitForSort(vertices.shift());
  35. }
  36. }
  37.  
  38. _sortIfNotSorted() {
  39. if (Object.keys(this.vertices).length > this.sortedVerticies.length) {
  40. this.sort();
  41. }
  42. }
  43.  
  44. get order() {
  45. this._sortIfNotSorted();
  46. return this.sortedVerticies;
  47. }
  48.  
  49. next() {
  50. this._sortIfNotSorted();
  51. }
  52. goTo(route) {
  53. this._sortIfNotSorted();
  54. const verticies = this.sortedVerticies;
  55. let curr = verticies.shift();
  56. while (curr.path !== route) {
  57. console.log('Visiting', curr.path);
  58. curr.resolve('some render root', {internet: true}, () => {});
  59. curr = verticies.shift();
  60. }
  61. console.log('Visiting', curr.path);
  62. curr.resolve('some render root', {internet: true}, () => {});
  63. }
  64.  
  65. _findRouteIndex(route) {
  66. this._sortIfNotSorted();
  67. return this.sortedVerticies.findIndex(route);
  68. }
  69. }
  70.  
  71. const router = new GraphRouter();
  72. const internetDeps = [];
  73. const tvDeps = ['/tv-internet/internet'];
  74. const phoneDeps = ['/tv-internet/tv'];
  75. const tvInterenetDeps =
  76. ['/tv-internet/internet', '/tv-internet/tv', '/tv-internet/phone', '/sign-up'];
  77. const doneDeps = ['/tv-internet', '/promotions', '/sign-up'];
  78. const resolveNow = (_, __, resolve) => resolve(true);
  79. router.addNode('/tv-internet/internet', internetDeps, (div, state, resolve) => {
  80. if (state.internet) {
  81. return resolve();
  82. } else {
  83. div.innerHTML = `<div> internet </div>`
  84. }
  85. });
  86. router.addNode('/tv-internet/tv', tvDeps, resolveNow);
  87. router.addNode('/tv-internet/phone', phoneDeps, resolveNow);
  88. router.addNode('/tv-internet', tvInterenetDeps, resolveNow);
  89. router.addNode('/promotions', ['/sign-up'], resolveNow);
  90. router.addNode('/sign-up', [], resolveNow);
  91. router.addNode('/done', doneDeps, resolveNow)
  92.  
  93. console.log(router.order.map((v) => v.path));
  94. router.goTo('/promotions');
  95. /*
  96. [ '/tv-internet/internet',
  97. '/tv-internet/tv',
  98. '/tv-internet/phone',
  99. '/sign-up',
  100. '/tv-internet',
  101. '/promotions',
  102. '/done' ]
  103. Visiting /tv-internet/internet
  104. Visiting /tv-internet/tv
  105. Visiting /tv-internet/phone
  106. Visiting /sign-up
  107. Visiting /tv-internet
  108. Visiting /promotions
  109. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement