@antv/layout 0.2.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/dist/layout.min.js +1 -1
  2. package/dist/layout.min.js.LICENSE.txt +0 -9
  3. package/dist/layout.min.js.map +1 -1
  4. package/es/layout/circular.js.map +1 -1
  5. package/es/layout/comboCombined.js +3 -19
  6. package/es/layout/comboCombined.js.map +1 -1
  7. package/es/layout/concentric.js.map +1 -1
  8. package/es/layout/dagre/graph.d.ts +91 -0
  9. package/es/layout/dagre/graph.js +4 -0
  10. package/es/layout/dagre/graph.js.map +1 -0
  11. package/es/layout/dagre/index.d.ts +3 -4
  12. package/es/layout/dagre/index.js +0 -2
  13. package/es/layout/dagre/index.js.map +1 -1
  14. package/es/layout/dagre/src/acyclic.d.ts +1 -2
  15. package/es/layout/dagre/src/acyclic.js +7 -7
  16. package/es/layout/dagre/src/acyclic.js.map +1 -1
  17. package/es/layout/dagre/src/add-border-segments.d.ts +1 -2
  18. package/es/layout/dagre/src/add-border-segments.js +5 -5
  19. package/es/layout/dagre/src/add-border-segments.js.map +1 -1
  20. package/es/layout/dagre/src/coordinate-system.d.ts +1 -2
  21. package/es/layout/dagre/src/coordinate-system.js +15 -5
  22. package/es/layout/dagre/src/coordinate-system.js.map +1 -1
  23. package/es/layout/dagre/src/data/list.d.ts +9 -5
  24. package/es/layout/dagre/src/data/list.js +25 -27
  25. package/es/layout/dagre/src/data/list.js.map +1 -1
  26. package/es/layout/dagre/src/debug.d.ts +2 -3
  27. package/es/layout/dagre/src/debug.js +3 -5
  28. package/es/layout/dagre/src/debug.js.map +1 -1
  29. package/es/layout/dagre/src/greedy-fas.d.ts +2 -3
  30. package/es/layout/dagre/src/greedy-fas.js +16 -15
  31. package/es/layout/dagre/src/greedy-fas.js.map +1 -1
  32. package/es/layout/dagre/src/layout.d.ts +2 -3
  33. package/es/layout/dagre/src/layout.js +170 -91
  34. package/es/layout/dagre/src/layout.js.map +1 -1
  35. package/es/layout/dagre/src/nesting-graph.d.ts +1 -2
  36. package/es/layout/dagre/src/nesting-graph.js +15 -10
  37. package/es/layout/dagre/src/nesting-graph.js.map +1 -1
  38. package/es/layout/dagre/src/normalize.d.ts +1 -2
  39. package/es/layout/dagre/src/normalize.js +12 -11
  40. package/es/layout/dagre/src/normalize.js.map +1 -1
  41. package/es/layout/dagre/src/order/add-subgraph-constraints.d.ts +1 -2
  42. package/es/layout/dagre/src/order/add-subgraph-constraints.js.map +1 -1
  43. package/es/layout/dagre/src/order/barycenter.d.ts +1 -2
  44. package/es/layout/dagre/src/order/barycenter.js.map +1 -1
  45. package/es/layout/dagre/src/order/build-layer-graph.d.ts +2 -3
  46. package/es/layout/dagre/src/order/build-layer-graph.js +12 -8
  47. package/es/layout/dagre/src/order/build-layer-graph.js.map +1 -1
  48. package/es/layout/dagre/src/order/cross-count.d.ts +2 -3
  49. package/es/layout/dagre/src/order/cross-count.js +13 -12
  50. package/es/layout/dagre/src/order/cross-count.js.map +1 -1
  51. package/es/layout/dagre/src/order/index.d.ts +2 -3
  52. package/es/layout/dagre/src/order/index.js +17 -15
  53. package/es/layout/dagre/src/order/index.js.map +1 -1
  54. package/es/layout/dagre/src/order/init-data-order.d.ts +1 -2
  55. package/es/layout/dagre/src/order/init-data-order.js +3 -5
  56. package/es/layout/dagre/src/order/init-data-order.js.map +1 -1
  57. package/es/layout/dagre/src/order/init-order.d.ts +2 -3
  58. package/es/layout/dagre/src/order/init-order.js +1 -2
  59. package/es/layout/dagre/src/order/init-order.js.map +1 -1
  60. package/es/layout/dagre/src/order/resolve-conflicts.d.ts +18 -3
  61. package/es/layout/dagre/src/order/resolve-conflicts.js +9 -29
  62. package/es/layout/dagre/src/order/resolve-conflicts.js.map +1 -1
  63. package/es/layout/dagre/src/order/sort-subgraph.d.ts +6 -3
  64. package/es/layout/dagre/src/order/sort-subgraph.js +19 -14
  65. package/es/layout/dagre/src/order/sort-subgraph.js.map +1 -1
  66. package/es/layout/dagre/src/order/sort.d.ts +6 -1
  67. package/es/layout/dagre/src/order/sort.js +2 -2
  68. package/es/layout/dagre/src/order/sort.js.map +1 -1
  69. package/es/layout/dagre/src/parent-dummy-chains.d.ts +1 -2
  70. package/es/layout/dagre/src/parent-dummy-chains.js +47 -44
  71. package/es/layout/dagre/src/parent-dummy-chains.js.map +1 -1
  72. package/es/layout/dagre/src/position/bk.d.ts +22 -31
  73. package/es/layout/dagre/src/position/bk.js +49 -83
  74. package/es/layout/dagre/src/position/bk.js.map +1 -1
  75. package/es/layout/dagre/src/position/index.d.ts +1 -2
  76. package/es/layout/dagre/src/position/index.js +12 -14
  77. package/es/layout/dagre/src/position/index.js.map +1 -1
  78. package/es/layout/dagre/src/rank/feasible-tree.d.ts +5 -6
  79. package/es/layout/dagre/src/rank/feasible-tree.js +1 -2
  80. package/es/layout/dagre/src/rank/feasible-tree.js.map +1 -1
  81. package/es/layout/dagre/src/rank/index.d.ts +2 -3
  82. package/es/layout/dagre/src/rank/index.js.map +1 -1
  83. package/es/layout/dagre/src/rank/network-simplex.d.ts +8 -11
  84. package/es/layout/dagre/src/rank/network-simplex.js +18 -31
  85. package/es/layout/dagre/src/rank/network-simplex.js.map +1 -1
  86. package/es/layout/dagre/src/rank/util.d.ts +4 -5
  87. package/es/layout/dagre/src/rank/util.js +37 -20
  88. package/es/layout/dagre/src/rank/util.js.map +1 -1
  89. package/es/layout/dagre/src/util.d.ts +29 -48
  90. package/es/layout/dagre/src/util.js +91 -101
  91. package/es/layout/dagre/src/util.js.map +1 -1
  92. package/es/layout/dagre.d.ts +1 -1
  93. package/es/layout/dagre.js +28 -24
  94. package/es/layout/dagre.js.map +1 -1
  95. package/es/layout/fruchterman.js.map +1 -1
  96. package/es/layout/gForce.js +14 -6
  97. package/es/layout/gForce.js.map +1 -1
  98. package/lib/index.js +5 -1
  99. package/lib/index.js.map +1 -1
  100. package/lib/layout/circular.js.map +1 -1
  101. package/lib/layout/comboCombined.js +2 -18
  102. package/lib/layout/comboCombined.js.map +1 -1
  103. package/lib/layout/comboForce.js +5 -5
  104. package/lib/layout/comboForce.js.map +1 -1
  105. package/lib/layout/concentric.js.map +1 -1
  106. package/lib/layout/dagre/graph.d.ts +91 -0
  107. package/lib/layout/dagre/graph.js +28 -0
  108. package/lib/layout/dagre/graph.js.map +1 -0
  109. package/lib/layout/dagre/index.d.ts +3 -4
  110. package/lib/layout/dagre/index.js +0 -2
  111. package/lib/layout/dagre/index.js.map +1 -1
  112. package/lib/layout/dagre/src/acyclic.d.ts +1 -2
  113. package/lib/layout/dagre/src/acyclic.js +7 -7
  114. package/lib/layout/dagre/src/acyclic.js.map +1 -1
  115. package/lib/layout/dagre/src/add-border-segments.d.ts +1 -2
  116. package/lib/layout/dagre/src/add-border-segments.js +5 -8
  117. package/lib/layout/dagre/src/add-border-segments.js.map +1 -1
  118. package/lib/layout/dagre/src/coordinate-system.d.ts +1 -2
  119. package/lib/layout/dagre/src/coordinate-system.js +15 -5
  120. package/lib/layout/dagre/src/coordinate-system.js.map +1 -1
  121. package/lib/layout/dagre/src/data/list.d.ts +9 -5
  122. package/lib/layout/dagre/src/data/list.js +25 -26
  123. package/lib/layout/dagre/src/data/list.js.map +1 -1
  124. package/lib/layout/dagre/src/debug.d.ts +2 -3
  125. package/lib/layout/dagre/src/debug.js +6 -11
  126. package/lib/layout/dagre/src/debug.js.map +1 -1
  127. package/lib/layout/dagre/src/greedy-fas.d.ts +2 -3
  128. package/lib/layout/dagre/src/greedy-fas.js +41 -15
  129. package/lib/layout/dagre/src/greedy-fas.js.map +1 -1
  130. package/lib/layout/dagre/src/layout.d.ts +2 -3
  131. package/lib/layout/dagre/src/layout.js +171 -100
  132. package/lib/layout/dagre/src/layout.js.map +1 -1
  133. package/lib/layout/dagre/src/nesting-graph.d.ts +1 -2
  134. package/lib/layout/dagre/src/nesting-graph.js +15 -13
  135. package/lib/layout/dagre/src/nesting-graph.js.map +1 -1
  136. package/lib/layout/dagre/src/normalize.d.ts +1 -2
  137. package/lib/layout/dagre/src/normalize.js +12 -14
  138. package/lib/layout/dagre/src/normalize.js.map +1 -1
  139. package/lib/layout/dagre/src/order/add-subgraph-constraints.d.ts +1 -2
  140. package/lib/layout/dagre/src/order/add-subgraph-constraints.js.map +1 -1
  141. package/lib/layout/dagre/src/order/barycenter.d.ts +1 -2
  142. package/lib/layout/dagre/src/order/barycenter.js.map +1 -1
  143. package/lib/layout/dagre/src/order/build-layer-graph.d.ts +2 -3
  144. package/lib/layout/dagre/src/order/build-layer-graph.js +13 -12
  145. package/lib/layout/dagre/src/order/build-layer-graph.js.map +1 -1
  146. package/lib/layout/dagre/src/order/cross-count.d.ts +2 -3
  147. package/lib/layout/dagre/src/order/cross-count.js +14 -13
  148. package/lib/layout/dagre/src/order/cross-count.js.map +1 -1
  149. package/lib/layout/dagre/src/order/index.d.ts +2 -3
  150. package/lib/layout/dagre/src/order/index.js +15 -13
  151. package/lib/layout/dagre/src/order/index.js.map +1 -1
  152. package/lib/layout/dagre/src/order/init-data-order.d.ts +1 -2
  153. package/lib/layout/dagre/src/order/init-data-order.js +3 -5
  154. package/lib/layout/dagre/src/order/init-data-order.js.map +1 -1
  155. package/lib/layout/dagre/src/order/init-order.d.ts +2 -3
  156. package/lib/layout/dagre/src/order/init-order.js +1 -2
  157. package/lib/layout/dagre/src/order/init-order.js.map +1 -1
  158. package/lib/layout/dagre/src/order/resolve-conflicts.d.ts +18 -3
  159. package/lib/layout/dagre/src/order/resolve-conflicts.js +9 -29
  160. package/lib/layout/dagre/src/order/resolve-conflicts.js.map +1 -1
  161. package/lib/layout/dagre/src/order/sort-subgraph.d.ts +6 -3
  162. package/lib/layout/dagre/src/order/sort-subgraph.js +16 -11
  163. package/lib/layout/dagre/src/order/sort-subgraph.js.map +1 -1
  164. package/lib/layout/dagre/src/order/sort.d.ts +6 -1
  165. package/lib/layout/dagre/src/order/sort.js +2 -5
  166. package/lib/layout/dagre/src/order/sort.js.map +1 -1
  167. package/lib/layout/dagre/src/parent-dummy-chains.d.ts +1 -2
  168. package/lib/layout/dagre/src/parent-dummy-chains.js +47 -44
  169. package/lib/layout/dagre/src/parent-dummy-chains.js.map +1 -1
  170. package/lib/layout/dagre/src/position/bk.d.ts +22 -31
  171. package/lib/layout/dagre/src/position/bk.js +75 -85
  172. package/lib/layout/dagre/src/position/bk.js.map +1 -1
  173. package/lib/layout/dagre/src/position/index.d.ts +1 -2
  174. package/lib/layout/dagre/src/position/index.js +14 -17
  175. package/lib/layout/dagre/src/position/index.js.map +1 -1
  176. package/lib/layout/dagre/src/rank/feasible-tree.d.ts +5 -6
  177. package/lib/layout/dagre/src/rank/feasible-tree.js +3 -7
  178. package/lib/layout/dagre/src/rank/feasible-tree.js.map +1 -1
  179. package/lib/layout/dagre/src/rank/index.d.ts +2 -3
  180. package/lib/layout/dagre/src/rank/index.js.map +1 -1
  181. package/lib/layout/dagre/src/rank/network-simplex.d.ts +8 -11
  182. package/lib/layout/dagre/src/rank/network-simplex.js +27 -35
  183. package/lib/layout/dagre/src/rank/network-simplex.js.map +1 -1
  184. package/lib/layout/dagre/src/rank/util.d.ts +4 -5
  185. package/lib/layout/dagre/src/rank/util.js +36 -19
  186. package/lib/layout/dagre/src/rank/util.js.map +1 -1
  187. package/lib/layout/dagre/src/util.d.ts +29 -48
  188. package/lib/layout/dagre/src/util.js +80 -92
  189. package/lib/layout/dagre/src/util.js.map +1 -1
  190. package/lib/layout/dagre.d.ts +1 -1
  191. package/lib/layout/dagre.js +27 -23
  192. package/lib/layout/dagre.js.map +1 -1
  193. package/lib/layout/er/core.js +5 -1
  194. package/lib/layout/er/core.js.map +1 -1
  195. package/lib/layout/force/force-in-a-box.js +7 -3
  196. package/lib/layout/force/force-in-a-box.js.map +1 -1
  197. package/lib/layout/force/force.js +5 -1
  198. package/lib/layout/force/force.js.map +1 -1
  199. package/lib/layout/force/index.js +5 -1
  200. package/lib/layout/force/index.js.map +1 -1
  201. package/lib/layout/fruchterman.js.map +1 -1
  202. package/lib/layout/gForce.js +10 -2
  203. package/lib/layout/gForce.js.map +1 -1
  204. package/lib/layout/grid.js +2 -2
  205. package/lib/layout/grid.js.map +1 -1
  206. package/lib/layout/index.js +5 -1
  207. package/lib/layout/index.js.map +1 -1
  208. package/lib/layout/radial/index.js +5 -1
  209. package/lib/layout/radial/index.js.map +1 -1
  210. package/lib/registy/index.js +1 -1
  211. package/lib/registy/index.js.map +1 -1
  212. package/lib/util/index.js +5 -1
  213. package/lib/util/index.js.map +1 -1
  214. package/package.json +3 -2
  215. package/src/index.ts +7 -0
  216. package/src/layout/base.ts +54 -0
  217. package/src/layout/circular.ts +369 -0
  218. package/src/layout/comboCombined.ts +390 -0
  219. package/src/layout/comboForce.ts +873 -0
  220. package/src/layout/concentric.ts +289 -0
  221. package/src/layout/constants.ts +21 -0
  222. package/src/layout/dagre/graph.ts +104 -0
  223. package/src/layout/dagre/index.ts +31 -0
  224. package/src/layout/dagre/src/acyclic.ts +58 -0
  225. package/src/layout/dagre/src/add-border-segments.ts +47 -0
  226. package/src/layout/dagre/src/coordinate-system.ts +77 -0
  227. package/src/layout/dagre/src/data/list.ts +60 -0
  228. package/src/layout/dagre/src/debug.ts +30 -0
  229. package/src/layout/dagre/src/greedy-fas.ts +144 -0
  230. package/src/layout/dagre/src/layout.ts +580 -0
  231. package/src/layout/dagre/src/nesting-graph.ts +143 -0
  232. package/src/layout/dagre/src/normalize.ts +96 -0
  233. package/src/layout/dagre/src/order/add-subgraph-constraints.ts +29 -0
  234. package/src/layout/dagre/src/order/barycenter.ts +26 -0
  235. package/src/layout/dagre/src/order/build-layer-graph.ts +82 -0
  236. package/src/layout/dagre/src/order/cross-count.ts +77 -0
  237. package/src/layout/dagre/src/order/index.ts +105 -0
  238. package/src/layout/dagre/src/order/init-data-order.ts +27 -0
  239. package/src/layout/dagre/src/order/init-order.ts +56 -0
  240. package/src/layout/dagre/src/order/resolve-conflicts.ts +152 -0
  241. package/src/layout/dagre/src/order/sort-subgraph.ts +105 -0
  242. package/src/layout/dagre/src/order/sort.ts +76 -0
  243. package/src/layout/dagre/src/parent-dummy-chains.ts +102 -0
  244. package/src/layout/dagre/src/position/bk.ts +494 -0
  245. package/src/layout/dagre/src/position/index.ts +82 -0
  246. package/src/layout/dagre/src/rank/feasible-tree.ts +165 -0
  247. package/src/layout/dagre/src/rank/index.ts +54 -0
  248. package/src/layout/dagre/src/rank/network-simplex.ts +225 -0
  249. package/src/layout/dagre/src/rank/util.ts +157 -0
  250. package/src/layout/dagre/src/util.ts +308 -0
  251. package/src/layout/dagre.ts +423 -0
  252. package/src/layout/dagreCompound.ts +518 -0
  253. package/src/layout/er/core.ts +117 -0
  254. package/src/layout/er/forceGrid.ts +95 -0
  255. package/src/layout/er/grid.ts +185 -0
  256. package/src/layout/er/index.ts +68 -0
  257. package/src/layout/er/mysqlWorkbench.ts +345 -0
  258. package/src/layout/er/type.ts +39 -0
  259. package/src/layout/force/force-in-a-box.ts +400 -0
  260. package/src/layout/force/force.ts +391 -0
  261. package/src/layout/force/index.ts +1 -0
  262. package/src/layout/forceAtlas2/body.ts +115 -0
  263. package/src/layout/forceAtlas2/index.ts +556 -0
  264. package/src/layout/forceAtlas2/quad.ts +115 -0
  265. package/src/layout/forceAtlas2/quadTree.ts +107 -0
  266. package/src/layout/fruchterman.ts +361 -0
  267. package/src/layout/gForce.ts +487 -0
  268. package/src/layout/gpu/fruchterman.ts +314 -0
  269. package/src/layout/gpu/fruchtermanShader.ts +204 -0
  270. package/src/layout/gpu/gForce.ts +406 -0
  271. package/src/layout/gpu/gForceShader.ts +221 -0
  272. package/src/layout/grid.ts +391 -0
  273. package/src/layout/index.ts +45 -0
  274. package/src/layout/layout.ts +75 -0
  275. package/src/layout/mds.ts +140 -0
  276. package/src/layout/radial/index.ts +1 -0
  277. package/src/layout/radial/mds.ts +51 -0
  278. package/src/layout/radial/radial.ts +500 -0
  279. package/src/layout/radial/radialNonoverlapForce.ts +189 -0
  280. package/src/layout/random.ts +75 -0
  281. package/src/layout/types.ts +421 -0
  282. package/src/registy/index.ts +43 -0
  283. package/src/util/array.ts +1 -0
  284. package/src/util/function.ts +64 -0
  285. package/src/util/gpu.ts +254 -0
  286. package/src/util/index.ts +6 -0
  287. package/src/util/math.ts +158 -0
  288. package/src/util/number.ts +8 -0
  289. package/src/util/object.ts +28 -0
  290. package/src/util/string.ts +18 -0
  291. package/CHANGELOG.md +0 -78
  292. package/es/layout/dagre/src/graphlib.d.ts +0 -2
  293. package/es/layout/dagre/src/graphlib.js +0 -51
  294. package/es/layout/dagre/src/graphlib.js.map +0 -1
  295. package/lib/layout/dagre/src/graphlib.d.ts +0 -2
  296. package/lib/layout/dagre/src/graphlib.js +0 -56
  297. package/lib/layout/dagre/src/graphlib.js.map +0 -1
@@ -0,0 +1,308 @@
1
+ import { isNumber } from "../../../util";
2
+ import { Graph, Node } from "../graph";
3
+
4
+ const safeSort = (valueA?: number, valueB?: number) => {
5
+ return Number(valueA) - Number(valueB);
6
+ };
7
+
8
+ /*
9
+ * Adds a dummy node to the graph and return v.
10
+ */
11
+ export const addDummyNode = (
12
+ g: Graph,
13
+ type: string,
14
+ attrs: Node<Record<string, any>>,
15
+ name: string
16
+ ) => {
17
+ let v;
18
+ do {
19
+ v = `${name}${Math.random()}`;
20
+ } while (g.hasNode(v));
21
+
22
+ attrs.dummy = type;
23
+ g.setNode(v, attrs);
24
+
25
+ return v;
26
+ };
27
+
28
+ /*
29
+ * Returns a new graph with only simple edges. Handles aggregation of data
30
+ * associated with multi-edges.
31
+ */
32
+ export const simplify = (g: Graph) => {
33
+ const simplified = new Graph().setGraph(g.graph());
34
+ g.nodes().forEach((v) => { simplified.setNode(v, g.node(v)); });
35
+ g.edges().forEach((e) => {
36
+ const simpleLabel = simplified.edgeFromArgs(e.v, e.w) || { weight: 0, minlen: 1 };
37
+ const label = g.edge(e)!;
38
+ simplified.setEdge(e.v, e.w, {
39
+ weight: simpleLabel.weight! + label.weight!,
40
+ minlen: Math.max(simpleLabel.minlen!, label.minlen!)
41
+ });
42
+ });
43
+ return simplified;
44
+ };
45
+
46
+ export const asNonCompoundGraph = (g: Graph) => {
47
+ const simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(
48
+ g.graph()
49
+ );
50
+ g.nodes().forEach((node) => {
51
+ if (!g.children(node)?.length) {
52
+ simplified.setNode(node, g.node(node));
53
+ }
54
+ });
55
+
56
+ g.edges().forEach((edge) => {
57
+ simplified.setEdgeObj(edge, g.edge(edge));
58
+ });
59
+
60
+ return simplified;
61
+ };
62
+
63
+ export const zipObject = <T = any>(keys: string[], values: T[]) => {
64
+ return keys?.reduce((obj, key, i) => {
65
+ obj[key] = values[i];
66
+ return obj;
67
+ }, {} as Record<string, T>);
68
+ };
69
+
70
+ export const successorWeights = (g: Graph) => {
71
+ const weightsMap: Record<string, Record<string, number>> = {};
72
+
73
+ g.nodes().forEach((node) => {
74
+ const sucs: Record<string, number> = {};
75
+ g.outEdges(node)?.forEach((e) => {
76
+ sucs[e.w] = (sucs[e.w] || 0) + (g.edge(e)?.weight || 0);
77
+ });
78
+ weightsMap[node] = sucs;
79
+ });
80
+
81
+ return weightsMap;
82
+ };
83
+
84
+
85
+
86
+ export const predecessorWeights = (g: Graph) => {
87
+ const nodes = g.nodes();
88
+
89
+ const weightMap = nodes.map((v) => {
90
+ const preds: Record<string, number> = {};
91
+ g.inEdges(v)?.forEach((e) => {
92
+ preds[e.v] = (preds[e.v] || 0) + g.edge(e)!.weight!;
93
+ });
94
+ return preds;
95
+ });
96
+ return zipObject(nodes, weightMap);
97
+ };
98
+
99
+ /*
100
+ * Finds where a line starting at point ({x, y}) would intersect a rectangle
101
+ * ({x, y, width, height}) if it were pointing at the rectangle's center.
102
+ */
103
+ export const intersectRect = (
104
+ rect: { x?: number; y?: number; width?: number; height?: number },
105
+ point: { x?: number; y?: number }
106
+ ) => {
107
+ const x = Number(rect.x);
108
+ const y = Number(rect.y);
109
+
110
+ // Rectangle intersection algorithm from:
111
+ // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes
112
+ const dx = Number(point.x) - x;
113
+ const dy = Number(point.y) - y;
114
+ let w = Number(rect.width) / 2;
115
+ let h = Number(rect.height) / 2;
116
+
117
+ if (!dx && !dy) {
118
+ // completely overlapped directly, then return points its self
119
+ return { x: 0, y: 0 };
120
+ }
121
+
122
+ let sx;
123
+ let sy;
124
+
125
+ if (Math.abs(dy) * w > Math.abs(dx) * h) {
126
+ // Intersection is top or bottom of rect.
127
+ if (dy < 0) {
128
+ h = -h;
129
+ }
130
+ sx = (h * dx) / dy;
131
+ sy = h;
132
+ } else {
133
+ // Intersection is left or right of rect.
134
+ if (dx < 0) {
135
+ w = -w;
136
+ }
137
+ sx = w;
138
+ sy = (w * dy) / dx;
139
+ }
140
+
141
+ return { x: x + sx, y: y + sy };
142
+ };
143
+
144
+ /*
145
+ * Given a DAG with each node assigned "rank" and "order" properties, this
146
+ * const will produce a matrix with the ids of each node.
147
+ */
148
+ export const buildLayerMatrix = (g: Graph) => {
149
+ const layeringNodes: string[][] = [];
150
+ const rankMax = maxRank(g) + 1;
151
+ for (let i = 0; i < rankMax; i++) {
152
+ layeringNodes.push([]);
153
+ }
154
+
155
+ // const layering = _.map(_.range(maxRank(g) + 1), function() { return []; });
156
+ g.nodes().forEach((v: string) => {
157
+ const node = g.node(v)!;
158
+ const rank = node.rank;
159
+ if (rank !== undefined && layeringNodes[rank]) {
160
+ layeringNodes[rank].push(v);
161
+ }
162
+ });
163
+
164
+ for (let i = 0; i < rankMax; i++) {
165
+ layeringNodes[i] = layeringNodes[i].sort((va: string, vb: string) =>
166
+ safeSort(g.node(va)?.order, g.node(vb)?.order)
167
+ );
168
+ }
169
+
170
+ return layeringNodes;
171
+ };
172
+
173
+ /*
174
+ * Adjusts the ranks for all nodes in the graph such that all nodes v have
175
+ * rank(v) >= 0 and at least one node w has rank(w) = 0.
176
+ */
177
+ export const normalizeRanks = (g: Graph) => {
178
+ const nodeRanks = g
179
+ .nodes()
180
+ .filter((v) => g.node(v)?.rank !== undefined)
181
+ .map((v) => g.node(v)!.rank!);
182
+ const min = Math.min(...nodeRanks);
183
+ g.nodes().forEach((v) => {
184
+ const node = g.node(v)!;
185
+ if (node.hasOwnProperty("rank") && min !== Infinity) {
186
+ node.rank! -= min;
187
+ }
188
+ });
189
+ };
190
+
191
+ export const removeEmptyRanks = (g: Graph) => {
192
+ // Ranks may not start at 0, so we need to offset them
193
+ const nodes = g.nodes();
194
+ const nodeRanks = nodes
195
+ .filter((v) => g.node(v)?.rank !== undefined)
196
+ .map((v) => g.node(v)!.rank as number);
197
+
198
+ const offset = Math.min(...nodeRanks);
199
+ const layers: string[][] = [];
200
+
201
+ nodes.forEach((v) => {
202
+ const rank = (g.node(v)?.rank || 0) - offset;
203
+
204
+ if (!layers[rank]) {
205
+ layers[rank] = [];
206
+ }
207
+ layers[rank].push(v);
208
+ });
209
+
210
+ let delta = 0;
211
+ const nodeRankFactor = g.graph().nodeRankFactor || 0;
212
+
213
+ for (let i = 0; i < layers.length; i++) {
214
+ const vs = layers[i];
215
+ if (vs === undefined) {
216
+ if (i % nodeRankFactor !== 0) {
217
+ delta -= 1;
218
+ }
219
+ } else if (delta) {
220
+ vs?.forEach((v: string) => {
221
+ const node = g.node(v);
222
+ if (node) {
223
+ node.rank = node.rank || 0;
224
+ node.rank += delta;
225
+ }
226
+ });
227
+ }
228
+ }
229
+ };
230
+
231
+ export const addBorderNode = (
232
+ g: Graph,
233
+ prefix: string,
234
+ rank?: number,
235
+ order?: number
236
+ ) => {
237
+ const node: Node = {
238
+ width: 0,
239
+ height: 0
240
+ };
241
+ if (isNumber(rank) && isNumber(order)) {
242
+ node.rank = rank;
243
+ node.order = order;
244
+ }
245
+ return addDummyNode(g, "border", node, prefix);
246
+ };
247
+
248
+ export const maxRank = (g: Graph) => {
249
+ let maxRank: number;
250
+ g.nodes().forEach((v) => {
251
+ const rank = g.node(v)?.rank;
252
+ if (rank !== undefined) {
253
+ if (maxRank === undefined || rank > maxRank) {
254
+ maxRank = rank;
255
+ }
256
+ }
257
+ });
258
+
259
+ if (!maxRank!) {
260
+ maxRank = 0;
261
+ }
262
+ return maxRank;
263
+ };
264
+
265
+ /*
266
+ * Partition a collection into two groups: `lhs` and `rhs`. If the supplied
267
+ * const returns true for an entry it goes into `lhs`. Otherwise it goes
268
+ * into `rhs.
269
+ */
270
+ export const partition = <T = any>(
271
+ collection: T[],
272
+ fn: (val: T) => boolean
273
+ ) => {
274
+ const result = { lhs: [] as T[], rhs: [] as T[] };
275
+ collection?.forEach((value) => {
276
+ if (fn(value)) {
277
+ result.lhs.push(value);
278
+ } else {
279
+ result.rhs.push(value);
280
+ }
281
+ });
282
+ return result;
283
+ };
284
+
285
+ /*
286
+ * Returns a new const that wraps `fn` with a timer. The wrapper logs the
287
+ * time it takes to execute the function.
288
+ */
289
+ export const time = (name: string, fn: () => void) => {
290
+ const start = Date.now();
291
+ try {
292
+ return fn();
293
+ } finally {
294
+ console.log(`${name} time: ${Date.now() - start}ms`);
295
+ }
296
+ };
297
+
298
+ export const notime = (name: string, fn: () => void) => {
299
+ return fn();
300
+ };
301
+
302
+ export const minBy = <T = any>(array: T[], func: (param: T) => number) => {
303
+ return array.reduce((a, b) => {
304
+ const valA = func(a);
305
+ const valB = func(b);
306
+ return valA > valB ? b : a;
307
+ });
308
+ };