451 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			451 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import {
 | ||
|   filter_default,
 | ||
|   forEach_default,
 | ||
|   isUndefined_default,
 | ||
|   keys_default,
 | ||
|   reduce_default,
 | ||
|   union_default,
 | ||
|   values_default
 | ||
| } from "./chunk-ZZTYOBSU.mjs";
 | ||
| import {
 | ||
|   isEmpty_default
 | ||
| } from "./chunk-PSZZOCOG.mjs";
 | ||
| import {
 | ||
|   constant_default,
 | ||
|   isFunction_default
 | ||
| } from "./chunk-PEQZQI46.mjs";
 | ||
| import {
 | ||
|   __name
 | ||
| } from "./chunk-DLQEHMXD.mjs";
 | ||
| 
 | ||
| // ../../node_modules/.pnpm/dagre-d3-es@7.0.11/node_modules/dagre-d3-es/src/graphlib/graph.js
 | ||
| var DEFAULT_EDGE_NAME = "\0";
 | ||
| var GRAPH_NODE = "\0";
 | ||
| var EDGE_KEY_DELIM = "";
 | ||
| var Graph = class {
 | ||
|   static {
 | ||
|     __name(this, "Graph");
 | ||
|   }
 | ||
|   constructor(opts = {}) {
 | ||
|     this._isDirected = Object.prototype.hasOwnProperty.call(opts, "directed") ? opts.directed : true;
 | ||
|     this._isMultigraph = Object.prototype.hasOwnProperty.call(opts, "multigraph") ? opts.multigraph : false;
 | ||
|     this._isCompound = Object.prototype.hasOwnProperty.call(opts, "compound") ? opts.compound : false;
 | ||
|     this._label = void 0;
 | ||
|     this._defaultNodeLabelFn = constant_default(void 0);
 | ||
|     this._defaultEdgeLabelFn = constant_default(void 0);
 | ||
|     this._nodes = {};
 | ||
|     if (this._isCompound) {
 | ||
|       this._parent = {};
 | ||
|       this._children = {};
 | ||
|       this._children[GRAPH_NODE] = {};
 | ||
|     }
 | ||
|     this._in = {};
 | ||
|     this._preds = {};
 | ||
|     this._out = {};
 | ||
|     this._sucs = {};
 | ||
|     this._edgeObjs = {};
 | ||
|     this._edgeLabels = {};
 | ||
|   }
 | ||
|   /* === Graph functions ========= */
 | ||
|   isDirected() {
 | ||
|     return this._isDirected;
 | ||
|   }
 | ||
|   isMultigraph() {
 | ||
|     return this._isMultigraph;
 | ||
|   }
 | ||
|   isCompound() {
 | ||
|     return this._isCompound;
 | ||
|   }
 | ||
|   setGraph(label) {
 | ||
|     this._label = label;
 | ||
|     return this;
 | ||
|   }
 | ||
|   graph() {
 | ||
|     return this._label;
 | ||
|   }
 | ||
|   /* === Node functions ========== */
 | ||
|   setDefaultNodeLabel(newDefault) {
 | ||
|     if (!isFunction_default(newDefault)) {
 | ||
|       newDefault = constant_default(newDefault);
 | ||
|     }
 | ||
|     this._defaultNodeLabelFn = newDefault;
 | ||
|     return this;
 | ||
|   }
 | ||
|   nodeCount() {
 | ||
|     return this._nodeCount;
 | ||
|   }
 | ||
|   nodes() {
 | ||
|     return keys_default(this._nodes);
 | ||
|   }
 | ||
|   sources() {
 | ||
|     var self = this;
 | ||
|     return filter_default(this.nodes(), function(v) {
 | ||
|       return isEmpty_default(self._in[v]);
 | ||
|     });
 | ||
|   }
 | ||
|   sinks() {
 | ||
|     var self = this;
 | ||
|     return filter_default(this.nodes(), function(v) {
 | ||
|       return isEmpty_default(self._out[v]);
 | ||
|     });
 | ||
|   }
 | ||
|   setNodes(vs, value) {
 | ||
|     var args = arguments;
 | ||
|     var self = this;
 | ||
|     forEach_default(vs, function(v) {
 | ||
|       if (args.length > 1) {
 | ||
|         self.setNode(v, value);
 | ||
|       } else {
 | ||
|         self.setNode(v);
 | ||
|       }
 | ||
|     });
 | ||
|     return this;
 | ||
|   }
 | ||
|   setNode(v, value) {
 | ||
|     if (Object.prototype.hasOwnProperty.call(this._nodes, v)) {
 | ||
|       if (arguments.length > 1) {
 | ||
|         this._nodes[v] = value;
 | ||
|       }
 | ||
|       return this;
 | ||
|     }
 | ||
|     this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);
 | ||
|     if (this._isCompound) {
 | ||
|       this._parent[v] = GRAPH_NODE;
 | ||
|       this._children[v] = {};
 | ||
|       this._children[GRAPH_NODE][v] = true;
 | ||
|     }
 | ||
|     this._in[v] = {};
 | ||
|     this._preds[v] = {};
 | ||
|     this._out[v] = {};
 | ||
|     this._sucs[v] = {};
 | ||
|     ++this._nodeCount;
 | ||
|     return this;
 | ||
|   }
 | ||
|   node(v) {
 | ||
|     return this._nodes[v];
 | ||
|   }
 | ||
|   hasNode(v) {
 | ||
|     return Object.prototype.hasOwnProperty.call(this._nodes, v);
 | ||
|   }
 | ||
|   removeNode(v) {
 | ||
|     if (Object.prototype.hasOwnProperty.call(this._nodes, v)) {
 | ||
|       var removeEdge = /* @__PURE__ */ __name((e) => this.removeEdge(this._edgeObjs[e]), "removeEdge");
 | ||
|       delete this._nodes[v];
 | ||
|       if (this._isCompound) {
 | ||
|         this._removeFromParentsChildList(v);
 | ||
|         delete this._parent[v];
 | ||
|         forEach_default(this.children(v), (child) => {
 | ||
|           this.setParent(child);
 | ||
|         });
 | ||
|         delete this._children[v];
 | ||
|       }
 | ||
|       forEach_default(keys_default(this._in[v]), removeEdge);
 | ||
|       delete this._in[v];
 | ||
|       delete this._preds[v];
 | ||
|       forEach_default(keys_default(this._out[v]), removeEdge);
 | ||
|       delete this._out[v];
 | ||
|       delete this._sucs[v];
 | ||
|       --this._nodeCount;
 | ||
|     }
 | ||
|     return this;
 | ||
|   }
 | ||
|   setParent(v, parent) {
 | ||
|     if (!this._isCompound) {
 | ||
|       throw new Error("Cannot set parent in a non-compound graph");
 | ||
|     }
 | ||
|     if (isUndefined_default(parent)) {
 | ||
|       parent = GRAPH_NODE;
 | ||
|     } else {
 | ||
|       parent += "";
 | ||
|       for (var ancestor = parent; !isUndefined_default(ancestor); ancestor = this.parent(ancestor)) {
 | ||
|         if (ancestor === v) {
 | ||
|           throw new Error("Setting " + parent + " as parent of " + v + " would create a cycle");
 | ||
|         }
 | ||
|       }
 | ||
|       this.setNode(parent);
 | ||
|     }
 | ||
|     this.setNode(v);
 | ||
|     this._removeFromParentsChildList(v);
 | ||
|     this._parent[v] = parent;
 | ||
|     this._children[parent][v] = true;
 | ||
|     return this;
 | ||
|   }
 | ||
|   _removeFromParentsChildList(v) {
 | ||
|     delete this._children[this._parent[v]][v];
 | ||
|   }
 | ||
|   parent(v) {
 | ||
|     if (this._isCompound) {
 | ||
|       var parent = this._parent[v];
 | ||
|       if (parent !== GRAPH_NODE) {
 | ||
|         return parent;
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   children(v) {
 | ||
|     if (isUndefined_default(v)) {
 | ||
|       v = GRAPH_NODE;
 | ||
|     }
 | ||
|     if (this._isCompound) {
 | ||
|       var children = this._children[v];
 | ||
|       if (children) {
 | ||
|         return keys_default(children);
 | ||
|       }
 | ||
|     } else if (v === GRAPH_NODE) {
 | ||
|       return this.nodes();
 | ||
|     } else if (this.hasNode(v)) {
 | ||
|       return [];
 | ||
|     }
 | ||
|   }
 | ||
|   predecessors(v) {
 | ||
|     var predsV = this._preds[v];
 | ||
|     if (predsV) {
 | ||
|       return keys_default(predsV);
 | ||
|     }
 | ||
|   }
 | ||
|   successors(v) {
 | ||
|     var sucsV = this._sucs[v];
 | ||
|     if (sucsV) {
 | ||
|       return keys_default(sucsV);
 | ||
|     }
 | ||
|   }
 | ||
|   neighbors(v) {
 | ||
|     var preds = this.predecessors(v);
 | ||
|     if (preds) {
 | ||
|       return union_default(preds, this.successors(v));
 | ||
|     }
 | ||
|   }
 | ||
|   isLeaf(v) {
 | ||
|     var neighbors;
 | ||
|     if (this.isDirected()) {
 | ||
|       neighbors = this.successors(v);
 | ||
|     } else {
 | ||
|       neighbors = this.neighbors(v);
 | ||
|     }
 | ||
|     return neighbors.length === 0;
 | ||
|   }
 | ||
|   filterNodes(filter) {
 | ||
|     var copy = new this.constructor({
 | ||
|       directed: this._isDirected,
 | ||
|       multigraph: this._isMultigraph,
 | ||
|       compound: this._isCompound
 | ||
|     });
 | ||
|     copy.setGraph(this.graph());
 | ||
|     var self = this;
 | ||
|     forEach_default(this._nodes, function(value, v) {
 | ||
|       if (filter(v)) {
 | ||
|         copy.setNode(v, value);
 | ||
|       }
 | ||
|     });
 | ||
|     forEach_default(this._edgeObjs, function(e) {
 | ||
|       if (copy.hasNode(e.v) && copy.hasNode(e.w)) {
 | ||
|         copy.setEdge(e, self.edge(e));
 | ||
|       }
 | ||
|     });
 | ||
|     var parents = {};
 | ||
|     function findParent(v) {
 | ||
|       var parent = self.parent(v);
 | ||
|       if (parent === void 0 || copy.hasNode(parent)) {
 | ||
|         parents[v] = parent;
 | ||
|         return parent;
 | ||
|       } else if (parent in parents) {
 | ||
|         return parents[parent];
 | ||
|       } else {
 | ||
|         return findParent(parent);
 | ||
|       }
 | ||
|     }
 | ||
|     __name(findParent, "findParent");
 | ||
|     if (this._isCompound) {
 | ||
|       forEach_default(copy.nodes(), function(v) {
 | ||
|         copy.setParent(v, findParent(v));
 | ||
|       });
 | ||
|     }
 | ||
|     return copy;
 | ||
|   }
 | ||
|   /* === Edge functions ========== */
 | ||
|   setDefaultEdgeLabel(newDefault) {
 | ||
|     if (!isFunction_default(newDefault)) {
 | ||
|       newDefault = constant_default(newDefault);
 | ||
|     }
 | ||
|     this._defaultEdgeLabelFn = newDefault;
 | ||
|     return this;
 | ||
|   }
 | ||
|   edgeCount() {
 | ||
|     return this._edgeCount;
 | ||
|   }
 | ||
|   edges() {
 | ||
|     return values_default(this._edgeObjs);
 | ||
|   }
 | ||
|   setPath(vs, value) {
 | ||
|     var self = this;
 | ||
|     var args = arguments;
 | ||
|     reduce_default(vs, function(v, w) {
 | ||
|       if (args.length > 1) {
 | ||
|         self.setEdge(v, w, value);
 | ||
|       } else {
 | ||
|         self.setEdge(v, w);
 | ||
|       }
 | ||
|       return w;
 | ||
|     });
 | ||
|     return this;
 | ||
|   }
 | ||
|   /*
 | ||
|    * setEdge(v, w, [value, [name]])
 | ||
|    * setEdge({ v, w, [name] }, [value])
 | ||
|    */
 | ||
|   setEdge() {
 | ||
|     var v, w, name, value;
 | ||
|     var valueSpecified = false;
 | ||
|     var arg0 = arguments[0];
 | ||
|     if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) {
 | ||
|       v = arg0.v;
 | ||
|       w = arg0.w;
 | ||
|       name = arg0.name;
 | ||
|       if (arguments.length === 2) {
 | ||
|         value = arguments[1];
 | ||
|         valueSpecified = true;
 | ||
|       }
 | ||
|     } else {
 | ||
|       v = arg0;
 | ||
|       w = arguments[1];
 | ||
|       name = arguments[3];
 | ||
|       if (arguments.length > 2) {
 | ||
|         value = arguments[2];
 | ||
|         valueSpecified = true;
 | ||
|       }
 | ||
|     }
 | ||
|     v = "" + v;
 | ||
|     w = "" + w;
 | ||
|     if (!isUndefined_default(name)) {
 | ||
|       name = "" + name;
 | ||
|     }
 | ||
|     var e = edgeArgsToId(this._isDirected, v, w, name);
 | ||
|     if (Object.prototype.hasOwnProperty.call(this._edgeLabels, e)) {
 | ||
|       if (valueSpecified) {
 | ||
|         this._edgeLabels[e] = value;
 | ||
|       }
 | ||
|       return this;
 | ||
|     }
 | ||
|     if (!isUndefined_default(name) && !this._isMultigraph) {
 | ||
|       throw new Error("Cannot set a named edge when isMultigraph = false");
 | ||
|     }
 | ||
|     this.setNode(v);
 | ||
|     this.setNode(w);
 | ||
|     this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);
 | ||
|     var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);
 | ||
|     v = edgeObj.v;
 | ||
|     w = edgeObj.w;
 | ||
|     Object.freeze(edgeObj);
 | ||
|     this._edgeObjs[e] = edgeObj;
 | ||
|     incrementOrInitEntry(this._preds[w], v);
 | ||
|     incrementOrInitEntry(this._sucs[v], w);
 | ||
|     this._in[w][e] = edgeObj;
 | ||
|     this._out[v][e] = edgeObj;
 | ||
|     this._edgeCount++;
 | ||
|     return this;
 | ||
|   }
 | ||
|   edge(v, w, name) {
 | ||
|     var e = arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name);
 | ||
|     return this._edgeLabels[e];
 | ||
|   }
 | ||
|   hasEdge(v, w, name) {
 | ||
|     var e = arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name);
 | ||
|     return Object.prototype.hasOwnProperty.call(this._edgeLabels, e);
 | ||
|   }
 | ||
|   removeEdge(v, w, name) {
 | ||
|     var e = arguments.length === 1 ? edgeObjToId(this._isDirected, arguments[0]) : edgeArgsToId(this._isDirected, v, w, name);
 | ||
|     var edge = this._edgeObjs[e];
 | ||
|     if (edge) {
 | ||
|       v = edge.v;
 | ||
|       w = edge.w;
 | ||
|       delete this._edgeLabels[e];
 | ||
|       delete this._edgeObjs[e];
 | ||
|       decrementOrRemoveEntry(this._preds[w], v);
 | ||
|       decrementOrRemoveEntry(this._sucs[v], w);
 | ||
|       delete this._in[w][e];
 | ||
|       delete this._out[v][e];
 | ||
|       this._edgeCount--;
 | ||
|     }
 | ||
|     return this;
 | ||
|   }
 | ||
|   inEdges(v, u) {
 | ||
|     var inV = this._in[v];
 | ||
|     if (inV) {
 | ||
|       var edges = values_default(inV);
 | ||
|       if (!u) {
 | ||
|         return edges;
 | ||
|       }
 | ||
|       return filter_default(edges, function(edge) {
 | ||
|         return edge.v === u;
 | ||
|       });
 | ||
|     }
 | ||
|   }
 | ||
|   outEdges(v, w) {
 | ||
|     var outV = this._out[v];
 | ||
|     if (outV) {
 | ||
|       var edges = values_default(outV);
 | ||
|       if (!w) {
 | ||
|         return edges;
 | ||
|       }
 | ||
|       return filter_default(edges, function(edge) {
 | ||
|         return edge.w === w;
 | ||
|       });
 | ||
|     }
 | ||
|   }
 | ||
|   nodeEdges(v, w) {
 | ||
|     var inEdges = this.inEdges(v, w);
 | ||
|     if (inEdges) {
 | ||
|       return inEdges.concat(this.outEdges(v, w));
 | ||
|     }
 | ||
|   }
 | ||
| };
 | ||
| Graph.prototype._nodeCount = 0;
 | ||
| Graph.prototype._edgeCount = 0;
 | ||
| function incrementOrInitEntry(map, k) {
 | ||
|   if (map[k]) {
 | ||
|     map[k]++;
 | ||
|   } else {
 | ||
|     map[k] = 1;
 | ||
|   }
 | ||
| }
 | ||
| __name(incrementOrInitEntry, "incrementOrInitEntry");
 | ||
| function decrementOrRemoveEntry(map, k) {
 | ||
|   if (!--map[k]) {
 | ||
|     delete map[k];
 | ||
|   }
 | ||
| }
 | ||
| __name(decrementOrRemoveEntry, "decrementOrRemoveEntry");
 | ||
| function edgeArgsToId(isDirected, v_, w_, name) {
 | ||
|   var v = "" + v_;
 | ||
|   var w = "" + w_;
 | ||
|   if (!isDirected && v > w) {
 | ||
|     var tmp = v;
 | ||
|     v = w;
 | ||
|     w = tmp;
 | ||
|   }
 | ||
|   return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (isUndefined_default(name) ? DEFAULT_EDGE_NAME : name);
 | ||
| }
 | ||
| __name(edgeArgsToId, "edgeArgsToId");
 | ||
| function edgeArgsToObj(isDirected, v_, w_, name) {
 | ||
|   var v = "" + v_;
 | ||
|   var w = "" + w_;
 | ||
|   if (!isDirected && v > w) {
 | ||
|     var tmp = v;
 | ||
|     v = w;
 | ||
|     w = tmp;
 | ||
|   }
 | ||
|   var edgeObj = { v, w };
 | ||
|   if (name) {
 | ||
|     edgeObj.name = name;
 | ||
|   }
 | ||
|   return edgeObj;
 | ||
| }
 | ||
| __name(edgeArgsToObj, "edgeArgsToObj");
 | ||
| function edgeObjToId(isDirected, edgeObj) {
 | ||
|   return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);
 | ||
| }
 | ||
| __name(edgeObjToId, "edgeObjToId");
 | ||
| 
 | ||
| export {
 | ||
|   Graph
 | ||
| };
 | 
