{"version":3,"file":"graphology.mjs","sources":["../src/utils.js","../src/errors.js","../src/data.js","../src/attributes/nodes.js","../src/attributes/edges.js","../src/iteration/edges.js","../src/iteration/neighbors.js","../src/iteration/adjacency.js","../src/serialization.js","../src/graph.js","../src/classes.js","../src/endpoint.esm.js"],"sourcesContent":["/**\n * Graphology Utilities\n * =====================\n *\n * Collection of helpful functions used by the implementation.\n */\n\n/**\n * Object.assign-like polyfill.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nfunction assignPolyfill() {\n const target = arguments[0];\n\n for (let i = 1, l = arguments.length; i < l; i++) {\n if (!arguments[i]) continue;\n\n for (const k in arguments[i]) target[k] = arguments[i][k];\n }\n\n return target;\n}\n\nlet assign = assignPolyfill;\n\nif (typeof Object.assign === 'function') assign = Object.assign;\n\nexport {assign};\n\n/**\n * Function returning the first matching edge for given path.\n * Note: this function does not check the existence of source & target. This\n * must be performed by the caller.\n *\n * @param {Graph} graph - Target graph.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {string} type - Type of the edge (mixed, directed or undirected).\n * @return {string|null}\n */\nexport function getMatchingEdge(graph, source, target, type) {\n const sourceData = graph._nodes.get(source);\n\n let edge = null;\n\n if (!sourceData) return edge;\n\n if (type === 'mixed') {\n edge =\n (sourceData.out && sourceData.out[target]) ||\n (sourceData.undirected && sourceData.undirected[target]);\n } else if (type === 'directed') {\n edge = sourceData.out && sourceData.out[target];\n } else {\n edge = sourceData.undirected && sourceData.undirected[target];\n }\n\n return edge;\n}\n\n/**\n * Checks whether the given value is a plain object.\n *\n * @param {mixed} value - Target value.\n * @return {boolean}\n */\nexport function isPlainObject(value) {\n // NOTE: as per https://github.com/graphology/graphology/issues/149\n // this function has been loosened not to reject object instances\n // coming from other JavaScript contexts. It has also been chosen\n // not to improve it to avoid obvious false positives and avoid\n // taking a performance hit. People should really use TypeScript\n // if they want to avoid feeding subtly irrelvant attribute objects.\n return typeof value === 'object' && value !== null;\n}\n\n/**\n * Checks whether the given object is empty.\n *\n * @param {object} o - Target Object.\n * @return {boolean}\n */\nexport function isEmpty(o) {\n let k;\n\n for (k in o) return false;\n\n return true;\n}\n\n/**\n * Creates a \"private\" property for the given member name by concealing it\n * using the `enumerable` option.\n *\n * @param {object} target - Target object.\n * @param {string} name - Member name.\n */\nexport function privateProperty(target, name, value) {\n Object.defineProperty(target, name, {\n enumerable: false,\n configurable: false,\n writable: true,\n value\n });\n}\n\n/**\n * Creates a read-only property for the given member name & the given getter.\n *\n * @param {object} target - Target object.\n * @param {string} name - Member name.\n * @param {mixed} value - The attached getter or fixed value.\n */\nexport function readOnlyProperty(target, name, value) {\n const descriptor = {\n enumerable: true,\n configurable: true\n };\n\n if (typeof value === 'function') {\n descriptor.get = value;\n } else {\n descriptor.value = value;\n descriptor.writable = false;\n }\n\n Object.defineProperty(target, name, descriptor);\n}\n\n/**\n * Returns whether the given object constitute valid hints.\n *\n * @param {object} hints - Target object.\n */\nexport function validateHints(hints) {\n if (!isPlainObject(hints)) return false;\n\n if (hints.attributes && !Array.isArray(hints.attributes)) return false;\n\n return true;\n}\n\n/**\n * Creates a function generating incremental ids for edges.\n *\n * @return {function}\n */\nexport function incrementalIdStartingFromRandomByte() {\n let i = Math.floor(Math.random() * 256) & 0xff;\n\n return () => {\n return i++;\n };\n}\n","/**\n * Graphology Custom Errors\n * =========================\n *\n * Defining custom errors for ease of use & easy unit tests across\n * implementations (normalized typology rather than relying on error\n * messages to check whether the correct error was found).\n */\nexport class GraphError extends Error {\n constructor(message) {\n super();\n this.name = 'GraphError';\n this.message = message;\n }\n}\n\nexport class InvalidArgumentsGraphError extends GraphError {\n constructor(message) {\n super(message);\n this.name = 'InvalidArgumentsGraphError';\n\n // This is V8 specific to enhance stack readability\n if (typeof Error.captureStackTrace === 'function')\n Error.captureStackTrace(\n this,\n InvalidArgumentsGraphError.prototype.constructor\n );\n }\n}\n\nexport class NotFoundGraphError extends GraphError {\n constructor(message) {\n super(message);\n this.name = 'NotFoundGraphError';\n\n // This is V8 specific to enhance stack readability\n if (typeof Error.captureStackTrace === 'function')\n Error.captureStackTrace(this, NotFoundGraphError.prototype.constructor);\n }\n}\n\nexport class UsageGraphError extends GraphError {\n constructor(message) {\n super(message);\n this.name = 'UsageGraphError';\n\n // This is V8 specific to enhance stack readability\n if (typeof Error.captureStackTrace === 'function')\n Error.captureStackTrace(this, UsageGraphError.prototype.constructor);\n }\n}\n","/**\n * Graphology Internal Data Classes\n * =================================\n *\n * Internal classes hopefully reduced to structs by engines & storing\n * necessary information for nodes & edges.\n *\n * Note that those classes don't rely on the `class` keyword to avoid some\n * cruft introduced by most of ES2015 transpilers.\n */\n\n/**\n * MixedNodeData class.\n *\n * @constructor\n * @param {string} string - The node's key.\n * @param {object} attributes - Node's attributes.\n */\nexport function MixedNodeData(key, attributes) {\n // Attributes\n this.key = key;\n this.attributes = attributes;\n\n this.clear();\n}\n\nMixedNodeData.prototype.clear = function () {\n // Degrees\n this.inDegree = 0;\n this.outDegree = 0;\n this.undirectedDegree = 0;\n this.undirectedLoops = 0;\n this.directedLoops = 0;\n\n // Indices\n this.in = {};\n this.out = {};\n this.undirected = {};\n};\n\n/**\n * DirectedNodeData class.\n *\n * @constructor\n * @param {string} string - The node's key.\n * @param {object} attributes - Node's attributes.\n */\nexport function DirectedNodeData(key, attributes) {\n // Attributes\n this.key = key;\n this.attributes = attributes;\n\n this.clear();\n}\n\nDirectedNodeData.prototype.clear = function () {\n // Degrees\n this.inDegree = 0;\n this.outDegree = 0;\n this.directedLoops = 0;\n\n // Indices\n this.in = {};\n this.out = {};\n};\n\n/**\n * UndirectedNodeData class.\n *\n * @constructor\n * @param {string} string - The node's key.\n * @param {object} attributes - Node's attributes.\n */\nexport function UndirectedNodeData(key, attributes) {\n // Attributes\n this.key = key;\n this.attributes = attributes;\n\n this.clear();\n}\n\nUndirectedNodeData.prototype.clear = function () {\n // Degrees\n this.undirectedDegree = 0;\n this.undirectedLoops = 0;\n\n // Indices\n this.undirected = {};\n};\n\n/**\n * EdgeData class.\n *\n * @constructor\n * @param {boolean} undirected - Whether the edge is undirected.\n * @param {string} string - The edge's key.\n * @param {string} source - Source of the edge.\n * @param {string} target - Target of the edge.\n * @param {object} attributes - Edge's attributes.\n */\nexport function EdgeData(undirected, key, source, target, attributes) {\n // Attributes\n this.key = key;\n this.attributes = attributes;\n this.undirected = undirected;\n\n // Extremities\n this.source = source;\n this.target = target;\n}\n\nEdgeData.prototype.attach = function () {\n let outKey = 'out';\n let inKey = 'in';\n\n if (this.undirected) outKey = inKey = 'undirected';\n\n const source = this.source.key;\n const target = this.target.key;\n\n // Handling source\n this.source[outKey][target] = this;\n\n if (this.undirected && source === target) return;\n\n // Handling target\n this.target[inKey][source] = this;\n};\n\nEdgeData.prototype.attachMulti = function () {\n let outKey = 'out';\n let inKey = 'in';\n\n const source = this.source.key;\n const target = this.target.key;\n\n if (this.undirected) outKey = inKey = 'undirected';\n\n // Handling source\n const adj = this.source[outKey];\n const head = adj[target];\n\n if (typeof head === 'undefined') {\n adj[target] = this;\n\n // Self-loop optimization\n if (!(this.undirected && source === target)) {\n // Handling target\n this.target[inKey][source] = this;\n }\n\n return;\n }\n\n // Prepending to doubly-linked list\n head.previous = this;\n this.next = head;\n\n // Pointing to new head\n // NOTE: use mutating swap later to avoid lookup?\n adj[target] = this;\n this.target[inKey][source] = this;\n};\n\nEdgeData.prototype.detach = function () {\n const source = this.source.key;\n const target = this.target.key;\n\n let outKey = 'out';\n let inKey = 'in';\n\n if (this.undirected) outKey = inKey = 'undirected';\n\n delete this.source[outKey][target];\n\n // No-op delete in case of undirected self-loop\n delete this.target[inKey][source];\n};\n\nEdgeData.prototype.detachMulti = function () {\n const source = this.source.key;\n const target = this.target.key;\n\n let outKey = 'out';\n let inKey = 'in';\n\n if (this.undirected) outKey = inKey = 'undirected';\n\n // Deleting from doubly-linked list\n if (this.previous === undefined) {\n // We are dealing with the head\n\n // Should we delete the adjacency entry because it is now empty?\n if (this.next === undefined) {\n delete this.source[outKey][target];\n\n // No-op delete in case of undirected self-loop\n delete this.target[inKey][source];\n } else {\n // Detaching\n this.next.previous = undefined;\n\n // NOTE: could avoid the lookups by creating a #.become mutating method\n this.source[outKey][target] = this.next;\n\n // No-op delete in case of undirected self-loop\n this.target[inKey][source] = this.next;\n }\n } else {\n // We are dealing with another list node\n this.previous.next = this.next;\n\n // If not last\n if (this.next !== undefined) {\n this.next.previous = this.previous;\n }\n }\n};\n","/**\n * Graphology Node Attributes methods\n * ===================================\n */\nimport {assign, isPlainObject} from '../utils';\n\nimport {InvalidArgumentsGraphError, NotFoundGraphError} from '../errors';\n\nconst NODE = 0;\nconst SOURCE = 1;\nconst TARGET = 2;\nconst OPPOSITE = 3;\n\nfunction findRelevantNodeData(\n graph,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1,\n add2\n) {\n let nodeData, edgeData, arg1, arg2;\n\n nodeOrEdge = '' + nodeOrEdge;\n\n if (mode === NODE) {\n nodeData = graph._nodes.get(nodeOrEdge);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${nodeOrEdge}\" node in the graph.`\n );\n\n arg1 = nameOrEdge;\n arg2 = add1;\n } else if (mode === OPPOSITE) {\n nameOrEdge = '' + nameOrEdge;\n\n edgeData = graph._edges.get(nameOrEdge);\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${nameOrEdge}\" edge in the graph.`\n );\n\n const source = edgeData.source.key;\n const target = edgeData.target.key;\n\n if (nodeOrEdge === source) {\n nodeData = edgeData.target;\n } else if (nodeOrEdge === target) {\n nodeData = edgeData.source;\n } else {\n throw new NotFoundGraphError(\n `Graph.${method}: the \"${nodeOrEdge}\" node is not attached to the \"${nameOrEdge}\" edge (${source}, ${target}).`\n );\n }\n\n arg1 = add1;\n arg2 = add2;\n } else {\n edgeData = graph._edges.get(nodeOrEdge);\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${nodeOrEdge}\" edge in the graph.`\n );\n\n if (mode === SOURCE) {\n nodeData = edgeData.source;\n } else {\n nodeData = edgeData.target;\n }\n\n arg1 = nameOrEdge;\n arg2 = add1;\n }\n\n return [nodeData, arg1, arg2];\n}\n\nfunction attachNodeAttributeGetter(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, name] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n return data.attributes[name];\n };\n}\n\nfunction attachNodeAttributesGetter(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge) {\n const [data] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge\n );\n\n return data.attributes;\n };\n}\n\nfunction attachNodeAttributeChecker(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, name] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n return data.attributes.hasOwnProperty(name);\n };\n}\n\nfunction attachNodeAttributeSetter(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1, add2) {\n const [data, name, value] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1,\n add2\n );\n\n data.attributes[name] = value;\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'set',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\nfunction attachNodeAttributeUpdater(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1, add2) {\n const [data, name, updater] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1,\n add2\n );\n\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: updater should be a function.`\n );\n\n const attributes = data.attributes;\n const value = updater(attributes[name]);\n\n attributes[name] = value;\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'set',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\nfunction attachNodeAttributeRemover(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, name] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n delete data.attributes[name];\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'remove',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\nfunction attachNodeAttributesReplacer(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, attributes] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided attributes are not a plain object.`\n );\n\n data.attributes = attributes;\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'replace',\n attributes: data.attributes\n });\n\n return this;\n };\n}\n\nfunction attachNodeAttributesMerger(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, attributes] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided attributes are not a plain object.`\n );\n\n assign(data.attributes, attributes);\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'merge',\n attributes: data.attributes,\n data: attributes\n });\n\n return this;\n };\n}\n\nfunction attachNodeAttributesUpdater(Class, method, mode) {\n Class.prototype[method] = function (nodeOrEdge, nameOrEdge, add1) {\n const [data, updater] = findRelevantNodeData(\n this,\n method,\n mode,\n nodeOrEdge,\n nameOrEdge,\n add1\n );\n\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided updater is not a function.`\n );\n\n data.attributes = updater(data.attributes);\n\n // Emitting\n this.emit('nodeAttributesUpdated', {\n key: data.key,\n type: 'update',\n attributes: data.attributes\n });\n\n return this;\n };\n}\n\n/**\n * List of methods to attach.\n */\nconst NODE_ATTRIBUTES_METHODS = [\n {\n name: element => `get${element}Attribute`,\n attacher: attachNodeAttributeGetter\n },\n {\n name: element => `get${element}Attributes`,\n attacher: attachNodeAttributesGetter\n },\n {\n name: element => `has${element}Attribute`,\n attacher: attachNodeAttributeChecker\n },\n {\n name: element => `set${element}Attribute`,\n attacher: attachNodeAttributeSetter\n },\n {\n name: element => `update${element}Attribute`,\n attacher: attachNodeAttributeUpdater\n },\n {\n name: element => `remove${element}Attribute`,\n attacher: attachNodeAttributeRemover\n },\n {\n name: element => `replace${element}Attributes`,\n attacher: attachNodeAttributesReplacer\n },\n {\n name: element => `merge${element}Attributes`,\n attacher: attachNodeAttributesMerger\n },\n {\n name: element => `update${element}Attributes`,\n attacher: attachNodeAttributesUpdater\n }\n];\n\n/**\n * Attach every attributes-related methods to a Graph class.\n *\n * @param {function} Graph - Target class.\n */\nexport default function attachNodeAttributesMethods(Graph) {\n NODE_ATTRIBUTES_METHODS.forEach(function ({name, attacher}) {\n // For nodes\n attacher(Graph, name('Node'), NODE);\n\n // For sources\n attacher(Graph, name('Source'), SOURCE);\n\n // For targets\n attacher(Graph, name('Target'), TARGET);\n\n // For opposites\n attacher(Graph, name('Opposite'), OPPOSITE);\n });\n}\n","/**\n * Graphology Edge Attributes methods\n * ===================================\n */\nimport {assign, isPlainObject, getMatchingEdge} from '../utils';\n\nimport {\n InvalidArgumentsGraphError,\n NotFoundGraphError,\n UsageGraphError\n} from '../errors';\n\n/**\n * Attach an attribute getter method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributeGetter(Class, method, type) {\n /**\n * Get the desired attribute for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {string} name - Attribute's name.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {string} name - Attribute's name.\n *\n * @return {mixed} - The attribute's value.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, name) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element;\n const target = '' + name;\n\n name = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n return data.attributes[name];\n };\n}\n\n/**\n * Attach an attributes getter method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributesGetter(Class, method, type) {\n /**\n * Retrieves all the target element's attributes.\n *\n * Arity 2:\n * @param {any} element - Target element.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n *\n * @return {object} - The element's attributes.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 1) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element,\n target = '' + arguments[1];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n return data.attributes;\n };\n}\n\n/**\n * Attach an attribute checker method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributeChecker(Class, method, type) {\n /**\n * Checks whether the desired attribute is set for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {string} name - Attribute's name.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {string} name - Attribute's name.\n *\n * @return {boolean}\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, name) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element;\n const target = '' + name;\n\n name = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n return data.attributes.hasOwnProperty(name);\n };\n}\n\n/**\n * Attach an attribute setter method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributeSetter(Class, method, type) {\n /**\n * Set the desired attribute for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {string} name - Attribute's name.\n * @param {mixed} value - New attribute value.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {string} name - Attribute's name.\n * @param {mixed} value - New attribute value.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, name, value) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 3) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element;\n const target = '' + name;\n\n name = arguments[2];\n value = arguments[3];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n data.attributes[name] = value;\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'set',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\n/**\n * Attach an attribute updater method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributeUpdater(Class, method, type) {\n /**\n * Update the desired attribute for the given element (node or edge) using\n * the provided function.\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {string} name - Attribute's name.\n * @param {function} updater - Updater function.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {string} name - Attribute's name.\n * @param {function} updater - Updater function.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, name, updater) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 3) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element;\n const target = '' + name;\n\n name = arguments[2];\n updater = arguments[3];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: updater should be a function.`\n );\n\n data.attributes[name] = updater(data.attributes[name]);\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'set',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\n/**\n * Attach an attribute remover method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributeRemover(Class, method, type) {\n /**\n * Remove the desired attribute for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {string} name - Attribute's name.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {string} name - Attribute's name.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, name) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element;\n const target = '' + name;\n\n name = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n delete data.attributes[name];\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'remove',\n attributes: data.attributes,\n name\n });\n\n return this;\n };\n}\n\n/**\n * Attach an attribute replacer method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributesReplacer(Class, method, type) {\n /**\n * Replace the attributes for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {object} attributes - New attributes.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {object} attributes - New attributes.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, attributes) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element,\n target = '' + attributes;\n\n attributes = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided attributes are not a plain object.`\n );\n\n data.attributes = attributes;\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'replace',\n attributes: data.attributes\n });\n\n return this;\n };\n}\n\n/**\n * Attach an attribute merger method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributesMerger(Class, method, type) {\n /**\n * Merge the attributes for the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {object} attributes - Attributes to merge.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {object} attributes - Attributes to merge.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, attributes) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element,\n target = '' + attributes;\n\n attributes = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided attributes are not a plain object.`\n );\n\n assign(data.attributes, attributes);\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'merge',\n attributes: data.attributes,\n data: attributes\n });\n\n return this;\n };\n}\n\n/**\n * Attach an attribute updater method onto the provided class.\n *\n * @param {function} Class - Target class.\n * @param {string} method - Method name.\n * @param {string} type - Type of the edge to find.\n */\nfunction attachEdgeAttributesUpdater(Class, method, type) {\n /**\n * Update the attributes of the given element (node or edge).\n *\n * Arity 2:\n * @param {any} element - Target element.\n * @param {function} updater - Updater function.\n *\n * Arity 3 (only for edges):\n * @param {any} source - Source element.\n * @param {any} target - Target element.\n * @param {function} updater - Updater function.\n *\n * @return {Graph} - Returns itself for chaining.\n *\n * @throws {Error} - Will throw if too many arguments are provided.\n * @throws {Error} - Will throw if any of the elements is not found.\n */\n Class.prototype[method] = function (element, updater) {\n let data;\n\n if (this.type !== 'mixed' && type !== 'mixed' && type !== this.type)\n throw new UsageGraphError(\n `Graph.${method}: cannot find this type of edges in your ${this.type} graph.`\n );\n\n if (arguments.length > 2) {\n if (this.multi)\n throw new UsageGraphError(\n `Graph.${method}: cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.`\n );\n\n const source = '' + element,\n target = '' + updater;\n\n updater = arguments[2];\n\n data = getMatchingEdge(this, source, target, type);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find an edge for the given path (\"${source}\" - \"${target}\").`\n );\n } else {\n if (type !== 'mixed')\n throw new UsageGraphError(\n `Graph.${method}: calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.`\n );\n\n element = '' + element;\n data = this._edges.get(element);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.${method}: could not find the \"${element}\" edge in the graph.`\n );\n }\n\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.${method}: provided updater is not a function.`\n );\n\n data.attributes = updater(data.attributes);\n\n // Emitting\n this.emit('edgeAttributesUpdated', {\n key: data.key,\n type: 'update',\n attributes: data.attributes\n });\n\n return this;\n };\n}\n\n/**\n * List of methods to attach.\n */\nconst EDGE_ATTRIBUTES_METHODS = [\n {\n name: element => `get${element}Attribute`,\n attacher: attachEdgeAttributeGetter\n },\n {\n name: element => `get${element}Attributes`,\n attacher: attachEdgeAttributesGetter\n },\n {\n name: element => `has${element}Attribute`,\n attacher: attachEdgeAttributeChecker\n },\n {\n name: element => `set${element}Attribute`,\n attacher: attachEdgeAttributeSetter\n },\n {\n name: element => `update${element}Attribute`,\n attacher: attachEdgeAttributeUpdater\n },\n {\n name: element => `remove${element}Attribute`,\n attacher: attachEdgeAttributeRemover\n },\n {\n name: element => `replace${element}Attributes`,\n attacher: attachEdgeAttributesReplacer\n },\n {\n name: element => `merge${element}Attributes`,\n attacher: attachEdgeAttributesMerger\n },\n {\n name: element => `update${element}Attributes`,\n attacher: attachEdgeAttributesUpdater\n }\n];\n\n/**\n * Attach every attributes-related methods to a Graph class.\n *\n * @param {function} Graph - Target class.\n */\nexport default function attachEdgeAttributesMethods(Graph) {\n EDGE_ATTRIBUTES_METHODS.forEach(function ({name, attacher}) {\n // For edges\n attacher(Graph, name('Edge'), 'mixed');\n\n // For directed edges\n attacher(Graph, name('DirectedEdge'), 'directed');\n\n // For undirected edges\n attacher(Graph, name('UndirectedEdge'), 'undirected');\n });\n}\n","/**\n * Graphology Edge Iteration\n * ==========================\n *\n * Attaching some methods to the Graph class to be able to iterate over a\n * graph's edges.\n */\nimport Iterator from 'obliterator/iterator';\nimport chain from 'obliterator/chain';\nimport take from 'obliterator/take';\n\nimport {InvalidArgumentsGraphError, NotFoundGraphError} from '../errors';\n\n/**\n * Definitions.\n */\nconst EDGES_ITERATION = [\n {\n name: 'edges',\n type: 'mixed'\n },\n {\n name: 'inEdges',\n type: 'directed',\n direction: 'in'\n },\n {\n name: 'outEdges',\n type: 'directed',\n direction: 'out'\n },\n {\n name: 'inboundEdges',\n type: 'mixed',\n direction: 'in'\n },\n {\n name: 'outboundEdges',\n type: 'mixed',\n direction: 'out'\n },\n {\n name: 'directedEdges',\n type: 'directed'\n },\n {\n name: 'undirectedEdges',\n type: 'undirected'\n }\n];\n\n/**\n * Function iterating over edges from the given object to match one of them.\n *\n * @param {object} object - Target object.\n * @param {function} callback - Function to call.\n */\nfunction forEachSimple(breakable, object, callback, avoid) {\n let shouldBreak = false;\n\n for (const k in object) {\n if (k === avoid) continue;\n\n const edgeData = object[k];\n\n shouldBreak = callback(\n edgeData.key,\n edgeData.attributes,\n edgeData.source.key,\n edgeData.target.key,\n edgeData.source.attributes,\n edgeData.target.attributes,\n edgeData.undirected\n );\n\n if (breakable && shouldBreak) return edgeData.key;\n }\n\n return;\n}\n\nfunction forEachMulti(breakable, object, callback, avoid) {\n let edgeData, source, target;\n\n let shouldBreak = false;\n\n for (const k in object) {\n if (k === avoid) continue;\n\n edgeData = object[k];\n\n do {\n source = edgeData.source;\n target = edgeData.target;\n\n shouldBreak = callback(\n edgeData.key,\n edgeData.attributes,\n source.key,\n target.key,\n source.attributes,\n target.attributes,\n edgeData.undirected\n );\n\n if (breakable && shouldBreak) return edgeData.key;\n\n edgeData = edgeData.next;\n } while (edgeData !== undefined);\n }\n\n return;\n}\n\n/**\n * Function returning an iterator over edges from the given object.\n *\n * @param {object} object - Target object.\n * @return {Iterator}\n */\nfunction createIterator(object, avoid) {\n const keys = Object.keys(object);\n const l = keys.length;\n\n let edgeData;\n let i = 0;\n\n return new Iterator(function next() {\n do {\n if (!edgeData) {\n if (i >= l) return {done: true};\n\n const k = keys[i++];\n\n if (k === avoid) {\n edgeData = undefined;\n continue;\n }\n\n edgeData = object[k];\n } else {\n edgeData = edgeData.next;\n }\n } while (!edgeData);\n\n return {\n done: false,\n value: {\n edge: edgeData.key,\n attributes: edgeData.attributes,\n source: edgeData.source.key,\n target: edgeData.target.key,\n sourceAttributes: edgeData.source.attributes,\n targetAttributes: edgeData.target.attributes,\n undirected: edgeData.undirected\n }\n };\n });\n}\n\n/**\n * Function iterating over the egdes from the object at given key to match\n * one of them.\n *\n * @param {object} object - Target object.\n * @param {mixed} k - Neighbor key.\n * @param {function} callback - Callback to use.\n */\nfunction forEachForKeySimple(breakable, object, k, callback) {\n const edgeData = object[k];\n\n if (!edgeData) return;\n\n const sourceData = edgeData.source;\n const targetData = edgeData.target;\n\n if (\n callback(\n edgeData.key,\n edgeData.attributes,\n sourceData.key,\n targetData.key,\n sourceData.attributes,\n targetData.attributes,\n edgeData.undirected\n ) &&\n breakable\n )\n return edgeData.key;\n}\n\nfunction forEachForKeyMulti(breakable, object, k, callback) {\n let edgeData = object[k];\n\n if (!edgeData) return;\n\n let shouldBreak = false;\n\n do {\n shouldBreak = callback(\n edgeData.key,\n edgeData.attributes,\n edgeData.source.key,\n edgeData.target.key,\n edgeData.source.attributes,\n edgeData.target.attributes,\n edgeData.undirected\n );\n\n if (breakable && shouldBreak) return edgeData.key;\n\n edgeData = edgeData.next;\n } while (edgeData !== undefined);\n\n return;\n}\n\n/**\n * Function returning an iterator over the egdes from the object at given key.\n *\n * @param {object} object - Target object.\n * @param {mixed} k - Neighbor key.\n * @return {Iterator}\n */\nfunction createIteratorForKey(object, k) {\n let edgeData = object[k];\n\n if (edgeData.next !== undefined) {\n return new Iterator(function () {\n if (!edgeData) return {done: true};\n\n const value = {\n edge: edgeData.key,\n attributes: edgeData.attributes,\n source: edgeData.source.key,\n target: edgeData.target.key,\n sourceAttributes: edgeData.source.attributes,\n targetAttributes: edgeData.target.attributes,\n undirected: edgeData.undirected\n };\n\n edgeData = edgeData.next;\n\n return {\n done: false,\n value\n };\n });\n }\n\n return Iterator.of({\n edge: edgeData.key,\n attributes: edgeData.attributes,\n source: edgeData.source.key,\n target: edgeData.target.key,\n sourceAttributes: edgeData.source.attributes,\n targetAttributes: edgeData.target.attributes,\n undirected: edgeData.undirected\n });\n}\n\n/**\n * Function creating an array of edges for the given type.\n *\n * @param {Graph} graph - Target Graph instance.\n * @param {string} type - Type of edges to retrieve.\n * @return {array} - Array of edges.\n */\nfunction createEdgeArray(graph, type) {\n if (graph.size === 0) return [];\n\n if (type === 'mixed' || type === graph.type) {\n if (typeof Array.from === 'function')\n return Array.from(graph._edges.keys());\n\n return take(graph._edges.keys(), graph._edges.size);\n }\n\n const size =\n type === 'undirected' ? graph.undirectedSize : graph.directedSize;\n\n const list = new Array(size),\n mask = type === 'undirected';\n\n const iterator = graph._edges.values();\n\n let i = 0;\n let step, data;\n\n while (((step = iterator.next()), step.done !== true)) {\n data = step.value;\n\n if (data.undirected === mask) list[i++] = data.key;\n }\n\n return list;\n}\n\n/**\n * Function iterating over a graph's edges using a callback to match one of\n * them.\n *\n * @param {Graph} graph - Target Graph instance.\n * @param {string} type - Type of edges to retrieve.\n * @param {function} callback - Function to call.\n */\nfunction forEachEdge(breakable, graph, type, callback) {\n if (graph.size === 0) return;\n\n const shouldFilter = type !== 'mixed' && type !== graph.type;\n const mask = type === 'undirected';\n\n let step, data;\n let shouldBreak = false;\n const iterator = graph._edges.values();\n\n while (((step = iterator.next()), step.done !== true)) {\n data = step.value;\n\n if (shouldFilter && data.undirected !== mask) continue;\n\n const {key, attributes, source, target} = data;\n\n shouldBreak = callback(\n key,\n attributes,\n source.key,\n target.key,\n source.attributes,\n target.attributes,\n data.undirected\n );\n\n if (breakable && shouldBreak) return key;\n }\n\n return;\n}\n\n/**\n * Function creating an iterator of edges for the given type.\n *\n * @param {Graph} graph - Target Graph instance.\n * @param {string} type - Type of edges to retrieve.\n * @return {Iterator}\n */\nfunction createEdgeIterator(graph, type) {\n if (graph.size === 0) return Iterator.empty();\n\n const shouldFilter = type !== 'mixed' && type !== graph.type;\n const mask = type === 'undirected';\n\n const iterator = graph._edges.values();\n\n return new Iterator(function next() {\n let step, data;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n step = iterator.next();\n\n if (step.done) return step;\n\n data = step.value;\n\n if (shouldFilter && data.undirected !== mask) continue;\n\n break;\n }\n\n const value = {\n edge: data.key,\n attributes: data.attributes,\n source: data.source.key,\n target: data.target.key,\n sourceAttributes: data.source.attributes,\n targetAttributes: data.target.attributes,\n undirected: data.undirected\n };\n\n return {value, done: false};\n });\n}\n\n/**\n * Function iterating over a node's edges using a callback to match one of them.\n *\n * @param {boolean} multi - Whether the graph is multi or not.\n * @param {string} type - Type of edges to retrieve.\n * @param {string} direction - In or out?\n * @param {any} nodeData - Target node's data.\n * @param {function} callback - Function to call.\n */\nfunction forEachEdgeForNode(\n breakable,\n multi,\n type,\n direction,\n nodeData,\n callback\n) {\n const fn = multi ? forEachMulti : forEachSimple;\n\n let found;\n\n if (type !== 'undirected') {\n if (direction !== 'out') {\n found = fn(breakable, nodeData.in, callback);\n\n if (breakable && found) return found;\n }\n if (direction !== 'in') {\n found = fn(\n breakable,\n nodeData.out,\n callback,\n !direction ? nodeData.key : undefined\n );\n\n if (breakable && found) return found;\n }\n }\n\n if (type !== 'directed') {\n found = fn(breakable, nodeData.undirected, callback);\n\n if (breakable && found) return found;\n }\n\n return;\n}\n\n/**\n * Function creating an array of edges for the given type & the given node.\n *\n * @param {boolean} multi - Whether the graph is multi or not.\n * @param {string} type - Type of edges to retrieve.\n * @param {string} direction - In or out?\n * @param {any} nodeData - Target node's data.\n * @return {array} - Array of edges.\n */\nfunction createEdgeArrayForNode(multi, type, direction, nodeData) {\n const edges = []; // TODO: possibility to know size beforehand or factorize with map\n\n forEachEdgeForNode(false, multi, type, direction, nodeData, function (key) {\n edges.push(key);\n });\n\n return edges;\n}\n\n/**\n * Function iterating over a node's edges using a callback.\n *\n * @param {string} type - Type of edges to retrieve.\n * @param {string} direction - In or out?\n * @param {any} nodeData - Target node's data.\n * @return {Iterator}\n */\nfunction createEdgeIteratorForNode(type, direction, nodeData) {\n let iterator = Iterator.empty();\n\n if (type !== 'undirected') {\n if (direction !== 'out' && typeof nodeData.in !== 'undefined')\n iterator = chain(iterator, createIterator(nodeData.in));\n if (direction !== 'in' && typeof nodeData.out !== 'undefined')\n iterator = chain(\n iterator,\n createIterator(nodeData.out, !direction ? nodeData.key : undefined)\n );\n }\n\n if (type !== 'directed' && typeof nodeData.undirected !== 'undefined') {\n iterator = chain(iterator, createIterator(nodeData.undirected));\n }\n\n return iterator;\n}\n\n/**\n * Function iterating over edges for the given path using a callback to match\n * one of them.\n *\n * @param {string} type - Type of edges to retrieve.\n * @param {boolean} multi - Whether the graph is multi.\n * @param {string} direction - In or out?\n * @param {NodeData} sourceData - Source node's data.\n * @param {string} target - Target node.\n * @param {function} callback - Function to call.\n */\nfunction forEachEdgeForPath(\n breakable,\n type,\n multi,\n direction,\n sourceData,\n target,\n callback\n) {\n const fn = multi ? forEachForKeyMulti : forEachForKeySimple;\n\n let found;\n\n if (type !== 'undirected') {\n if (typeof sourceData.in !== 'undefined' && direction !== 'out') {\n found = fn(breakable, sourceData.in, target, callback);\n\n if (breakable && found) return found;\n }\n\n if (\n typeof sourceData.out !== 'undefined' &&\n direction !== 'in' &&\n (direction || sourceData.key !== target)\n ) {\n found = fn(breakable, sourceData.out, target, callback);\n\n if (breakable && found) return found;\n }\n }\n\n if (type !== 'directed') {\n if (typeof sourceData.undirected !== 'undefined') {\n found = fn(breakable, sourceData.undirected, target, callback);\n\n if (breakable && found) return found;\n }\n }\n\n return;\n}\n\n/**\n * Function creating an array of edges for the given path.\n *\n * @param {string} type - Type of edges to retrieve.\n * @param {boolean} multi - Whether the graph is multi.\n * @param {string} direction - In or out?\n * @param {NodeData} sourceData - Source node's data.\n * @param {any} target - Target node.\n * @return {array} - Array of edges.\n */\nfunction createEdgeArrayForPath(type, multi, direction, sourceData, target) {\n const edges = []; // TODO: possibility to know size beforehand or factorize with map\n\n forEachEdgeForPath(\n false,\n type,\n multi,\n direction,\n sourceData,\n target,\n function (key) {\n edges.push(key);\n }\n );\n\n return edges;\n}\n\n/**\n * Function returning an iterator over edges for the given path.\n *\n * @param {string} type - Type of edges to retrieve.\n * @param {string} direction - In or out?\n * @param {NodeData} sourceData - Source node's data.\n * @param {string} target - Target node.\n * @param {function} callback - Function to call.\n */\nfunction createEdgeIteratorForPath(type, direction, sourceData, target) {\n let iterator = Iterator.empty();\n\n if (type !== 'undirected') {\n if (\n typeof sourceData.in !== 'undefined' &&\n direction !== 'out' &&\n target in sourceData.in\n )\n iterator = chain(iterator, createIteratorForKey(sourceData.in, target));\n\n if (\n typeof sourceData.out !== 'undefined' &&\n direction !== 'in' &&\n target in sourceData.out &&\n (direction || sourceData.key !== target)\n )\n iterator = chain(iterator, createIteratorForKey(sourceData.out, target));\n }\n\n if (type !== 'directed') {\n if (\n typeof sourceData.undirected !== 'undefined' &&\n target in sourceData.undirected\n )\n iterator = chain(\n iterator,\n createIteratorForKey(sourceData.undirected, target)\n );\n }\n\n return iterator;\n}\n\n/**\n * Function attaching an edge array creator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachEdgeArrayCreator(Class, description) {\n const {name, type, direction} = description;\n\n /**\n * Function returning an array of certain edges.\n *\n * Arity 0: Return all the relevant edges.\n *\n * Arity 1: Return all of a node's relevant edges.\n * @param {any} node - Target node.\n *\n * Arity 2: Return the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n *\n * @return {array|number} - The edges or the number of edges.\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[name] = function (source, target) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type)\n return [];\n\n if (!arguments.length) return createEdgeArray(this, type);\n\n if (arguments.length === 1) {\n source = '' + source;\n\n const nodeData = this._nodes.get(source);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${source}\" node in the graph.`\n );\n\n // Iterating over a node's edges\n return createEdgeArrayForNode(\n this.multi,\n type === 'mixed' ? this.type : type,\n direction,\n nodeData\n );\n }\n\n if (arguments.length === 2) {\n source = '' + source;\n target = '' + target;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${target}\" target node in the graph.`\n );\n\n // Iterating over the edges between source & target\n return createEdgeArrayForPath(\n type,\n this.multi,\n direction,\n sourceData,\n target\n );\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.${name}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`\n );\n };\n}\n\n/**\n * Function attaching a edge callback iterator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachForEachEdge(Class, description) {\n const {name, type, direction} = description;\n\n const forEachName = 'forEach' + name[0].toUpperCase() + name.slice(1, -1);\n\n /**\n * Function iterating over the graph's relevant edges by applying the given\n * callback.\n *\n * Arity 1: Iterate over all the relevant edges.\n * @param {function} callback - Callback to use.\n *\n * Arity 2: Iterate over all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * Arity 3: Iterate over the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} callback - Callback to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[forEachName] = function (source, target, callback) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type) return;\n\n if (arguments.length === 1) {\n callback = source;\n return forEachEdge(false, this, type, callback);\n }\n\n if (arguments.length === 2) {\n source = '' + source;\n callback = target;\n\n const nodeData = this._nodes.get(source);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${forEachName}: could not find the \"${source}\" node in the graph.`\n );\n\n // Iterating over a node's edges\n // TODO: maybe attach the sub method to the instance dynamically?\n return forEachEdgeForNode(\n false,\n this.multi,\n type === 'mixed' ? this.type : type,\n direction,\n nodeData,\n callback\n );\n }\n\n if (arguments.length === 3) {\n source = '' + source;\n target = '' + target;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${forEachName}: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.${forEachName}: could not find the \"${target}\" target node in the graph.`\n );\n\n // Iterating over the edges between source & target\n return forEachEdgeForPath(\n false,\n type,\n this.multi,\n direction,\n sourceData,\n target,\n callback\n );\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.${forEachName}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`\n );\n };\n\n /**\n * Function mapping the graph's relevant edges by applying the given\n * callback.\n *\n * Arity 1: Map all the relevant edges.\n * @param {function} callback - Callback to use.\n *\n * Arity 2: Map all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * Arity 3: Map the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} callback - Callback to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const mapName = 'map' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[mapName] = function () {\n const args = Array.prototype.slice.call(arguments);\n const callback = args.pop();\n\n let result;\n\n // We know the result length beforehand\n if (args.length === 0) {\n let length = 0;\n\n if (type !== 'directed') length += this.undirectedSize;\n if (type !== 'undirected') length += this.directedSize;\n\n result = new Array(length);\n\n let i = 0;\n\n args.push((e, ea, s, t, sa, ta, u) => {\n result[i++] = callback(e, ea, s, t, sa, ta, u);\n });\n }\n\n // We don't know the result length beforehand\n // TODO: we can in some instances of simple graphs, knowing degree\n else {\n result = [];\n\n args.push((e, ea, s, t, sa, ta, u) => {\n result.push(callback(e, ea, s, t, sa, ta, u));\n });\n }\n\n this[forEachName].apply(this, args);\n\n return result;\n };\n\n /**\n * Function filtering the graph's relevant edges using the provided predicate\n * function.\n *\n * Arity 1: Filter all the relevant edges.\n * @param {function} predicate - Predicate to use.\n *\n * Arity 2: Filter all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} predicate - Predicate to use.\n *\n * Arity 3: Filter the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} predicate - Predicate to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const filterName = 'filter' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[filterName] = function () {\n const args = Array.prototype.slice.call(arguments);\n const callback = args.pop();\n\n const result = [];\n\n args.push((e, ea, s, t, sa, ta, u) => {\n if (callback(e, ea, s, t, sa, ta, u)) result.push(e);\n });\n\n this[forEachName].apply(this, args);\n\n return result;\n };\n\n /**\n * Function reducing the graph's relevant edges using the provided accumulator\n * function.\n *\n * Arity 1: Reduce all the relevant edges.\n * @param {function} accumulator - Accumulator to use.\n * @param {any} initialValue - Initial value.\n *\n * Arity 2: Reduce all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} accumulator - Accumulator to use.\n * @param {any} initialValue - Initial value.\n *\n * Arity 3: Reduce the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} accumulator - Accumulator to use.\n * @param {any} initialValue - Initial value.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const reduceName = 'reduce' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[reduceName] = function () {\n let args = Array.prototype.slice.call(arguments);\n\n if (args.length < 2 || args.length > 4) {\n throw new InvalidArgumentsGraphError(\n `Graph.${reduceName}: invalid number of arguments (expecting 2, 3 or 4 and got ${args.length}).`\n );\n }\n\n if (\n typeof args[args.length - 1] === 'function' &&\n typeof args[args.length - 2] !== 'function'\n ) {\n throw new InvalidArgumentsGraphError(\n `Graph.${reduceName}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`\n );\n }\n\n let callback;\n let initialValue;\n\n if (args.length === 2) {\n callback = args[0];\n initialValue = args[1];\n args = [];\n } else if (args.length === 3) {\n callback = args[1];\n initialValue = args[2];\n args = [args[0]];\n } else if (args.length === 4) {\n callback = args[2];\n initialValue = args[3];\n args = [args[0], args[1]];\n }\n\n let accumulator = initialValue;\n\n args.push((e, ea, s, t, sa, ta, u) => {\n accumulator = callback(accumulator, e, ea, s, t, sa, ta, u);\n });\n\n this[forEachName].apply(this, args);\n\n return accumulator;\n };\n}\n\n/**\n * Function attaching a breakable edge callback iterator method to the Graph\n * prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachFindEdge(Class, description) {\n const {name, type, direction} = description;\n\n const findEdgeName = 'find' + name[0].toUpperCase() + name.slice(1, -1);\n\n /**\n * Function iterating over the graph's relevant edges in order to match\n * one of them using the provided predicate function.\n *\n * Arity 1: Iterate over all the relevant edges.\n * @param {function} callback - Callback to use.\n *\n * Arity 2: Iterate over all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * Arity 3: Iterate over the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} callback - Callback to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[findEdgeName] = function (source, target, callback) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type)\n return false;\n\n if (arguments.length === 1) {\n callback = source;\n return forEachEdge(true, this, type, callback);\n }\n\n if (arguments.length === 2) {\n source = '' + source;\n callback = target;\n\n const nodeData = this._nodes.get(source);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${findEdgeName}: could not find the \"${source}\" node in the graph.`\n );\n\n // Iterating over a node's edges\n // TODO: maybe attach the sub method to the instance dynamically?\n return forEachEdgeForNode(\n true,\n this.multi,\n type === 'mixed' ? this.type : type,\n direction,\n nodeData,\n callback\n );\n }\n\n if (arguments.length === 3) {\n source = '' + source;\n target = '' + target;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${findEdgeName}: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.${findEdgeName}: could not find the \"${target}\" target node in the graph.`\n );\n\n // Iterating over the edges between source & target\n return forEachEdgeForPath(\n true,\n type,\n this.multi,\n direction,\n sourceData,\n target,\n callback\n );\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.${findEdgeName}: too many arguments (expecting 1, 2 or 3 and got ${arguments.length}).`\n );\n };\n\n /**\n * Function iterating over the graph's relevant edges in order to assert\n * whether any one of them matches the provided predicate function.\n *\n * Arity 1: Iterate over all the relevant edges.\n * @param {function} callback - Callback to use.\n *\n * Arity 2: Iterate over all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * Arity 3: Iterate over the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} callback - Callback to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const someName = 'some' + name[0].toUpperCase() + name.slice(1, -1);\n\n Class.prototype[someName] = function () {\n const args = Array.prototype.slice.call(arguments);\n const callback = args.pop();\n\n args.push((e, ea, s, t, sa, ta, u) => {\n return callback(e, ea, s, t, sa, ta, u);\n });\n\n const found = this[findEdgeName].apply(this, args);\n\n if (found) return true;\n\n return false;\n };\n\n /**\n * Function iterating over the graph's relevant edges in order to assert\n * whether all of them matche the provided predicate function.\n *\n * Arity 1: Iterate over all the relevant edges.\n * @param {function} callback - Callback to use.\n *\n * Arity 2: Iterate over all of a node's relevant edges.\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * Arity 3: Iterate over the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n * @param {function} callback - Callback to use.\n *\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const everyName = 'every' + name[0].toUpperCase() + name.slice(1, -1);\n\n Class.prototype[everyName] = function () {\n const args = Array.prototype.slice.call(arguments);\n const callback = args.pop();\n\n args.push((e, ea, s, t, sa, ta, u) => {\n return !callback(e, ea, s, t, sa, ta, u);\n });\n\n const found = this[findEdgeName].apply(this, args);\n\n if (found) return false;\n\n return true;\n };\n}\n\n/**\n * Function attaching an edge iterator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachEdgeIteratorCreator(Class, description) {\n const {name: originalName, type, direction} = description;\n\n const name = originalName.slice(0, -1) + 'Entries';\n\n /**\n * Function returning an iterator over the graph's edges.\n *\n * Arity 0: Iterate over all the relevant edges.\n *\n * Arity 1: Iterate over all of a node's relevant edges.\n * @param {any} node - Target node.\n *\n * Arity 2: Iterate over the relevant edges across the given path.\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n *\n * @return {array|number} - The edges or the number of edges.\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[name] = function (source, target) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type)\n return Iterator.empty();\n\n if (!arguments.length) return createEdgeIterator(this, type);\n\n if (arguments.length === 1) {\n source = '' + source;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${source}\" node in the graph.`\n );\n\n // Iterating over a node's edges\n return createEdgeIteratorForNode(type, direction, sourceData);\n }\n\n if (arguments.length === 2) {\n source = '' + source;\n target = '' + target;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${target}\" target node in the graph.`\n );\n\n // Iterating over the edges between source & target\n return createEdgeIteratorForPath(type, direction, sourceData, target);\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.${name}: too many arguments (expecting 0, 1 or 2 and got ${arguments.length}).`\n );\n };\n}\n\n/**\n * Function attaching every edge iteration method to the Graph class.\n *\n * @param {function} Graph - Graph class.\n */\nexport default function attachEdgeIterationMethods(Graph) {\n EDGES_ITERATION.forEach(description => {\n attachEdgeArrayCreator(Graph, description);\n attachForEachEdge(Graph, description);\n attachFindEdge(Graph, description);\n attachEdgeIteratorCreator(Graph, description);\n });\n}\n","/**\n * Graphology Neighbor Iteration\n * ==============================\n *\n * Attaching some methods to the Graph class to be able to iterate over\n * neighbors.\n */\nimport Iterator from 'obliterator/iterator';\nimport chain from 'obliterator/chain';\n\nimport {NotFoundGraphError, InvalidArgumentsGraphError} from '../errors';\n\n/**\n * Definitions.\n */\nconst NEIGHBORS_ITERATION = [\n {\n name: 'neighbors',\n type: 'mixed'\n },\n {\n name: 'inNeighbors',\n type: 'directed',\n direction: 'in'\n },\n {\n name: 'outNeighbors',\n type: 'directed',\n direction: 'out'\n },\n {\n name: 'inboundNeighbors',\n type: 'mixed',\n direction: 'in'\n },\n {\n name: 'outboundNeighbors',\n type: 'mixed',\n direction: 'out'\n },\n {\n name: 'directedNeighbors',\n type: 'directed'\n },\n {\n name: 'undirectedNeighbors',\n type: 'undirected'\n }\n];\n\n/**\n * Helpers.\n */\nfunction CompositeSetWrapper() {\n this.A = null;\n this.B = null;\n}\n\nCompositeSetWrapper.prototype.wrap = function (set) {\n if (this.A === null) this.A = set;\n else if (this.B === null) this.B = set;\n};\n\nCompositeSetWrapper.prototype.has = function (key) {\n if (this.A !== null && key in this.A) return true;\n if (this.B !== null && key in this.B) return true;\n return false;\n};\n\n/**\n * Function iterating over the given node's relevant neighbors to match\n * one of them using a predicated function.\n *\n * @param {string} type - Type of neighbors.\n * @param {string} direction - Direction.\n * @param {any} nodeData - Target node's data.\n * @param {function} callback - Callback to use.\n */\nfunction forEachInObjectOnce(breakable, visited, nodeData, object, callback) {\n for (const k in object) {\n const edgeData = object[k];\n\n const sourceData = edgeData.source;\n const targetData = edgeData.target;\n\n const neighborData = sourceData === nodeData ? targetData : sourceData;\n\n if (visited && visited.has(neighborData.key)) continue;\n\n const shouldBreak = callback(neighborData.key, neighborData.attributes);\n\n if (breakable && shouldBreak) return neighborData.key;\n }\n\n return;\n}\n\nfunction forEachNeighbor(breakable, type, direction, nodeData, callback) {\n // If we want only undirected or in or out, we can roll some optimizations\n if (type !== 'mixed') {\n if (type === 'undirected')\n return forEachInObjectOnce(\n breakable,\n null,\n nodeData,\n nodeData.undirected,\n callback\n );\n\n if (typeof direction === 'string')\n return forEachInObjectOnce(\n breakable,\n null,\n nodeData,\n nodeData[direction],\n callback\n );\n }\n\n // Else we need to keep a set of neighbors not to return duplicates\n // We cheat by querying the other adjacencies\n const visited = new CompositeSetWrapper();\n\n let found;\n\n if (type !== 'undirected') {\n if (direction !== 'out') {\n found = forEachInObjectOnce(\n breakable,\n null,\n nodeData,\n nodeData.in,\n callback\n );\n\n if (breakable && found) return found;\n\n visited.wrap(nodeData.in);\n }\n if (direction !== 'in') {\n found = forEachInObjectOnce(\n breakable,\n visited,\n nodeData,\n nodeData.out,\n callback\n );\n\n if (breakable && found) return found;\n\n visited.wrap(nodeData.out);\n }\n }\n\n if (type !== 'directed') {\n found = forEachInObjectOnce(\n breakable,\n visited,\n nodeData,\n nodeData.undirected,\n callback\n );\n\n if (breakable && found) return found;\n }\n\n return;\n}\n\n/**\n * Function creating an array of relevant neighbors for the given node.\n *\n * @param {string} type - Type of neighbors.\n * @param {string} direction - Direction.\n * @param {any} nodeData - Target node's data.\n * @return {Array} - The list of neighbors.\n */\nfunction createNeighborArrayForNode(type, direction, nodeData) {\n // If we want only undirected or in or out, we can roll some optimizations\n if (type !== 'mixed') {\n if (type === 'undirected') return Object.keys(nodeData.undirected);\n\n if (typeof direction === 'string') return Object.keys(nodeData[direction]);\n }\n\n const neighbors = [];\n\n forEachNeighbor(false, type, direction, nodeData, function (key) {\n neighbors.push(key);\n });\n\n return neighbors;\n}\n\n/**\n * Function returning an iterator over the given node's relevant neighbors.\n *\n * @param {string} type - Type of neighbors.\n * @param {string} direction - Direction.\n * @param {any} nodeData - Target node's data.\n * @return {Iterator}\n */\nfunction createDedupedObjectIterator(visited, nodeData, object) {\n const keys = Object.keys(object);\n const l = keys.length;\n\n let i = 0;\n\n return new Iterator(function next() {\n let neighborData = null;\n\n do {\n if (i >= l) {\n if (visited) visited.wrap(object);\n return {done: true};\n }\n\n const edgeData = object[keys[i++]];\n\n const sourceData = edgeData.source;\n const targetData = edgeData.target;\n\n neighborData = sourceData === nodeData ? targetData : sourceData;\n\n if (visited && visited.has(neighborData.key)) {\n neighborData = null;\n continue;\n }\n } while (neighborData === null);\n\n return {\n done: false,\n value: {neighbor: neighborData.key, attributes: neighborData.attributes}\n };\n });\n}\n\nfunction createNeighborIterator(type, direction, nodeData) {\n // If we want only undirected or in or out, we can roll some optimizations\n if (type !== 'mixed') {\n if (type === 'undirected')\n return createDedupedObjectIterator(null, nodeData, nodeData.undirected);\n\n if (typeof direction === 'string')\n return createDedupedObjectIterator(null, nodeData, nodeData[direction]);\n }\n\n let iterator = Iterator.empty();\n\n // Else we need to keep a set of neighbors not to return duplicates\n // We cheat by querying the other adjacencies\n const visited = new CompositeSetWrapper();\n\n if (type !== 'undirected') {\n if (direction !== 'out') {\n iterator = chain(\n iterator,\n createDedupedObjectIterator(visited, nodeData, nodeData.in)\n );\n }\n if (direction !== 'in') {\n iterator = chain(\n iterator,\n createDedupedObjectIterator(visited, nodeData, nodeData.out)\n );\n }\n }\n\n if (type !== 'directed') {\n iterator = chain(\n iterator,\n createDedupedObjectIterator(visited, nodeData, nodeData.undirected)\n );\n }\n\n return iterator;\n}\n\n/**\n * Function attaching a neighbors array creator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachNeighborArrayCreator(Class, description) {\n const {name, type, direction} = description;\n\n /**\n * Function returning an array of certain neighbors.\n *\n * @param {any} node - Target node.\n * @return {array} - The neighbors of neighbors.\n *\n * @throws {Error} - Will throw if node is not found in the graph.\n */\n Class.prototype[name] = function (node) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type)\n return [];\n\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${name}: could not find the \"${node}\" node in the graph.`\n );\n\n // Here, we want to iterate over a node's relevant neighbors\n return createNeighborArrayForNode(\n type === 'mixed' ? this.type : type,\n direction,\n nodeData\n );\n };\n}\n\n/**\n * Function attaching a neighbors callback iterator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachForEachNeighbor(Class, description) {\n const {name, type, direction} = description;\n\n const forEachName = 'forEach' + name[0].toUpperCase() + name.slice(1, -1);\n\n /**\n * Function iterating over all the relevant neighbors using a callback.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[forEachName] = function (node, callback) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type) return;\n\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${forEachName}: could not find the \"${node}\" node in the graph.`\n );\n\n // Here, we want to iterate over a node's relevant neighbors\n forEachNeighbor(\n false,\n type === 'mixed' ? this.type : type,\n direction,\n nodeData,\n callback\n );\n };\n\n /**\n * Function mapping the relevant neighbors using a callback.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const mapName = 'map' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[mapName] = function (node, callback) {\n // TODO: optimize when size is known beforehand\n const result = [];\n\n this[forEachName](node, (n, a) => {\n result.push(callback(n, a));\n });\n\n return result;\n };\n\n /**\n * Function filtering the relevant neighbors using a callback.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const filterName = 'filter' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[filterName] = function (node, callback) {\n const result = [];\n\n this[forEachName](node, (n, a) => {\n if (callback(n, a)) result.push(n);\n });\n\n return result;\n };\n\n /**\n * Function reducing the relevant neighbors using a callback.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const reduceName = 'reduce' + name[0].toUpperCase() + name.slice(1);\n\n Class.prototype[reduceName] = function (node, callback, initialValue) {\n if (arguments.length < 3)\n throw new InvalidArgumentsGraphError(\n `Graph.${reduceName}: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.`\n );\n\n let accumulator = initialValue;\n\n this[forEachName](node, (n, a) => {\n accumulator = callback(accumulator, n, a);\n });\n\n return accumulator;\n };\n}\n\n/**\n * Function attaching a breakable neighbors callback iterator method to the\n * Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachFindNeighbor(Class, description) {\n const {name, type, direction} = description;\n\n const capitalizedSingular = name[0].toUpperCase() + name.slice(1, -1);\n\n const findName = 'find' + capitalizedSingular;\n\n /**\n * Function iterating over all the relevant neighbors using a callback.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n * @return {undefined}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[findName] = function (node, callback) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type) return;\n\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${findName}: could not find the \"${node}\" node in the graph.`\n );\n\n // Here, we want to iterate over a node's relevant neighbors\n return forEachNeighbor(\n true,\n type === 'mixed' ? this.type : type,\n direction,\n nodeData,\n callback\n );\n };\n\n /**\n * Function iterating over all the relevant neighbors to find if any of them\n * matches the given predicate.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const someName = 'some' + capitalizedSingular;\n\n Class.prototype[someName] = function (node, callback) {\n const found = this[findName](node, callback);\n\n if (found) return true;\n\n return false;\n };\n\n /**\n * Function iterating over all the relevant neighbors to find if all of them\n * matche the given predicate.\n *\n * @param {any} node - Target node.\n * @param {function} callback - Callback to use.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n const everyName = 'every' + capitalizedSingular;\n\n Class.prototype[everyName] = function (node, callback) {\n const found = this[findName](node, (n, a) => {\n return !callback(n, a);\n });\n\n if (found) return false;\n\n return true;\n };\n}\n\n/**\n * Function attaching a neighbors callback iterator method to the Graph prototype.\n *\n * @param {function} Class - Target class.\n * @param {object} description - Method description.\n */\nfunction attachNeighborIteratorCreator(Class, description) {\n const {name, type, direction} = description;\n\n const iteratorName = name.slice(0, -1) + 'Entries';\n\n /**\n * Function returning an iterator over all the relevant neighbors.\n *\n * @param {any} node - Target node.\n * @return {Iterator}\n *\n * @throws {Error} - Will throw if there are too many arguments.\n */\n Class.prototype[iteratorName] = function (node) {\n // Early termination\n if (type !== 'mixed' && this.type !== 'mixed' && type !== this.type)\n return Iterator.empty();\n\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (typeof nodeData === 'undefined')\n throw new NotFoundGraphError(\n `Graph.${iteratorName}: could not find the \"${node}\" node in the graph.`\n );\n\n // Here, we want to iterate over a node's relevant neighbors\n return createNeighborIterator(\n type === 'mixed' ? this.type : type,\n direction,\n nodeData\n );\n };\n}\n\n/**\n * Function attaching every neighbor iteration method to the Graph class.\n *\n * @param {function} Graph - Graph class.\n */\nexport default function attachNeighborIterationMethods(Graph) {\n NEIGHBORS_ITERATION.forEach(description => {\n attachNeighborArrayCreator(Graph, description);\n attachForEachNeighbor(Graph, description);\n attachFindNeighbor(Graph, description);\n attachNeighborIteratorCreator(Graph, description);\n });\n}\n","/**\n * Graphology Adjacency Iteration\n * ===============================\n *\n * Attaching some methods to the Graph class to be able to iterate over a\n * graph's adjacency.\n */\n\n/**\n * Function iterating over a simple graph's adjacency using a callback.\n *\n * @param {boolean} breakable - Can we break?\n * @param {boolean} assymetric - Whether to emit undirected edges only once.\n * @param {boolean} disconnectedNodes - Whether to emit disconnected nodes.\n * @param {Graph} graph - Target Graph instance.\n * @param {callback} function - Iteration callback.\n */\nexport function forEachAdjacency(\n breakable,\n assymetric,\n disconnectedNodes,\n graph,\n callback\n) {\n const iterator = graph._nodes.values();\n\n const type = graph.type;\n\n let step, sourceData, neighbor, adj, edgeData, targetData, shouldBreak;\n\n while (((step = iterator.next()), step.done !== true)) {\n let hasEdges = false;\n\n sourceData = step.value;\n\n if (type !== 'undirected') {\n adj = sourceData.out;\n\n for (neighbor in adj) {\n edgeData = adj[neighbor];\n\n do {\n targetData = edgeData.target;\n\n hasEdges = true;\n shouldBreak = callback(\n sourceData.key,\n targetData.key,\n sourceData.attributes,\n targetData.attributes,\n edgeData.key,\n edgeData.attributes,\n edgeData.undirected\n );\n\n if (breakable && shouldBreak) return edgeData;\n\n edgeData = edgeData.next;\n } while (edgeData);\n }\n }\n\n if (type !== 'directed') {\n adj = sourceData.undirected;\n\n for (neighbor in adj) {\n if (assymetric && sourceData.key > neighbor) continue;\n\n edgeData = adj[neighbor];\n\n do {\n targetData = edgeData.target;\n\n if (targetData.key !== neighbor) targetData = edgeData.source;\n\n hasEdges = true;\n shouldBreak = callback(\n sourceData.key,\n targetData.key,\n sourceData.attributes,\n targetData.attributes,\n edgeData.key,\n edgeData.attributes,\n edgeData.undirected\n );\n\n if (breakable && shouldBreak) return edgeData;\n\n edgeData = edgeData.next;\n } while (edgeData);\n }\n }\n\n if (disconnectedNodes && !hasEdges) {\n shouldBreak = callback(\n sourceData.key,\n null,\n sourceData.attributes,\n null,\n null,\n null,\n null\n );\n\n if (breakable && shouldBreak) return null;\n }\n }\n\n return;\n}\n","/**\n * Graphology Serialization Utilities\n * ===================================\n *\n * Collection of functions used by the graph serialization schemes.\n */\nimport {InvalidArgumentsGraphError} from './errors';\nimport {assign, isPlainObject, isEmpty} from './utils';\n\n/**\n * Formats internal node data into a serialized node.\n *\n * @param {any} key - The node's key.\n * @param {object} data - Internal node's data.\n * @return {array} - The serialized node.\n */\nexport function serializeNode(key, data) {\n const serialized = {key};\n\n if (!isEmpty(data.attributes))\n serialized.attributes = assign({}, data.attributes);\n\n return serialized;\n}\n\n/**\n * Formats internal edge data into a serialized edge.\n *\n * @param {string} type - The graph's type.\n * @param {any} key - The edge's key.\n * @param {object} data - Internal edge's data.\n * @return {array} - The serialized edge.\n */\nexport function serializeEdge(type, key, data) {\n const serialized = {\n key,\n source: data.source.key,\n target: data.target.key\n };\n\n if (!isEmpty(data.attributes))\n serialized.attributes = assign({}, data.attributes);\n\n if (type === 'mixed' && data.undirected) serialized.undirected = true;\n\n return serialized;\n}\n\n/**\n * Checks whether the given value is a serialized node.\n *\n * @param {mixed} value - Target value.\n * @return {string|null}\n */\nexport function validateSerializedNode(value) {\n if (!isPlainObject(value))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid serialized node. A serialized node should be a plain object with at least a \"key\" property.'\n );\n\n if (!('key' in value))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: serialized node is missing its key.'\n );\n\n if (\n 'attributes' in value &&\n (!isPlainObject(value.attributes) || value.attributes === null)\n )\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.'\n );\n}\n\n/**\n * Checks whether the given value is a serialized edge.\n *\n * @param {mixed} value - Target value.\n * @return {string|null}\n */\nexport function validateSerializedEdge(value) {\n if (!isPlainObject(value))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a \"source\" & \"target\" property.'\n );\n\n if (!('source' in value))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: serialized edge is missing its source.'\n );\n\n if (!('target' in value))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: serialized edge is missing its target.'\n );\n\n if (\n 'attributes' in value &&\n (!isPlainObject(value.attributes) || value.attributes === null)\n )\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.'\n );\n\n if ('undirected' in value && typeof value.undirected !== 'boolean')\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.'\n );\n}\n","/* eslint no-nested-ternary: 0 */\n/**\n * Graphology Reference Implementation\n * ====================================\n *\n * Reference implementation of the graphology specs.\n */\nimport {EventEmitter} from 'events';\nimport Iterator from 'obliterator/iterator';\nimport take from 'obliterator/take';\n\nimport {\n InvalidArgumentsGraphError,\n NotFoundGraphError,\n UsageGraphError\n} from './errors';\n\nimport {\n MixedNodeData,\n DirectedNodeData,\n UndirectedNodeData,\n EdgeData\n} from './data';\n\nimport attachNodeAttributesMethods from './attributes/nodes';\nimport attachEdgeAttributesMethods from './attributes/edges';\nimport attachEdgeIterationMethods from './iteration/edges';\nimport attachNeighborIterationMethods from './iteration/neighbors';\nimport {forEachAdjacency} from './iteration/adjacency';\n\nimport {\n serializeNode,\n serializeEdge,\n validateSerializedNode,\n validateSerializedEdge\n} from './serialization';\n\nimport {\n assign,\n getMatchingEdge,\n isPlainObject,\n privateProperty,\n readOnlyProperty,\n incrementalIdStartingFromRandomByte,\n validateHints\n} from './utils';\n\n/**\n * Constants.\n */\nconst INSTANCE_ID = incrementalIdStartingFromRandomByte();\n\n/**\n * Enums.\n */\nconst TYPES = new Set(['directed', 'undirected', 'mixed']);\n\nconst EMITTER_PROPS = new Set([\n 'domain',\n '_events',\n '_eventsCount',\n '_maxListeners'\n]);\n\nconst EDGE_ADD_METHODS = [\n {\n name: verb => `${verb}Edge`,\n generateKey: true\n },\n {\n name: verb => `${verb}DirectedEdge`,\n generateKey: true,\n type: 'directed'\n },\n {\n name: verb => `${verb}UndirectedEdge`,\n generateKey: true,\n type: 'undirected'\n },\n {\n name: verb => `${verb}EdgeWithKey`\n },\n {\n name: verb => `${verb}DirectedEdgeWithKey`,\n type: 'directed'\n },\n {\n name: verb => `${verb}UndirectedEdgeWithKey`,\n type: 'undirected'\n }\n];\n\n/**\n * Default options.\n */\nconst DEFAULTS = {\n allowSelfLoops: true,\n multi: false,\n type: 'mixed'\n};\n\n/**\n * Abstract functions used by the Graph class for various methods.\n */\n\n/**\n * Internal method used to add a node to the given graph\n *\n * @param {Graph} graph - Target graph.\n * @param {any} node - The node's key.\n * @param {object} [attributes] - Optional attributes.\n * @return {NodeData} - Created node data.\n */\nfunction addNode(graph, node, attributes) {\n if (attributes && !isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.addNode: invalid attributes. Expecting an object but got \"${attributes}\"`\n );\n\n // String coercion\n node = '' + node;\n attributes = attributes || {};\n\n if (graph._nodes.has(node))\n throw new UsageGraphError(\n `Graph.addNode: the \"${node}\" node already exist in the graph.`\n );\n\n const data = new graph.NodeDataClass(node, attributes);\n\n // Adding the node to internal register\n graph._nodes.set(node, data);\n\n // Emitting\n graph.emit('nodeAdded', {\n key: node,\n attributes\n });\n\n return data;\n}\n\n/**\n * Same as the above but without sanity checks because we call this in contexts\n * where necessary checks were already done.\n */\nfunction unsafeAddNode(graph, node, attributes) {\n const data = new graph.NodeDataClass(node, attributes);\n\n graph._nodes.set(node, data);\n\n graph.emit('nodeAdded', {\n key: node,\n attributes\n });\n\n return data;\n}\n\n/**\n * Internal method used to add an arbitrary edge to the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {string} name - Name of the child method for errors.\n * @param {boolean} mustGenerateKey - Should the graph generate an id?\n * @param {boolean} undirected - Whether the edge is undirected.\n * @param {any} edge - The edge's key.\n * @param {any} source - The source node.\n * @param {any} target - The target node.\n * @param {object} [attributes] - Optional attributes.\n * @return {any} - The edge.\n *\n * @throws {Error} - Will throw if the graph is of the wrong type.\n * @throws {Error} - Will throw if the given attributes are not an object.\n * @throws {Error} - Will throw if source or target doesn't exist.\n * @throws {Error} - Will throw if the edge already exist.\n */\nfunction addEdge(\n graph,\n name,\n mustGenerateKey,\n undirected,\n edge,\n source,\n target,\n attributes\n) {\n // Checking validity of operation\n if (!undirected && graph.type === 'undirected')\n throw new UsageGraphError(\n `Graph.${name}: you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.`\n );\n\n if (undirected && graph.type === 'directed')\n throw new UsageGraphError(\n `Graph.${name}: you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.`\n );\n\n if (attributes && !isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${name}: invalid attributes. Expecting an object but got \"${attributes}\"`\n );\n\n // Coercion of source & target:\n source = '' + source;\n target = '' + target;\n attributes = attributes || {};\n\n if (!graph.allowSelfLoops && source === target)\n throw new UsageGraphError(\n `Graph.${name}: source & target are the same (\"${source}\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`\n );\n\n const sourceData = graph._nodes.get(source),\n targetData = graph._nodes.get(target);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.${name}: source node \"${source}\" not found.`\n );\n\n if (!targetData)\n throw new NotFoundGraphError(\n `Graph.${name}: target node \"${target}\" not found.`\n );\n\n // Must the graph generate an id for this edge?\n const eventData = {\n key: null,\n undirected,\n source,\n target,\n attributes\n };\n\n if (mustGenerateKey) {\n // NOTE: in this case we can guarantee that the key does not already\n // exist and is already correctly casted as a string\n edge = graph._edgeKeyGenerator();\n } else {\n // Coercion of edge key\n edge = '' + edge;\n\n // Here, we have a key collision\n if (graph._edges.has(edge))\n throw new UsageGraphError(\n `Graph.${name}: the \"${edge}\" edge already exists in the graph.`\n );\n }\n\n // Here, we might have a source / target collision\n if (\n !graph.multi &&\n (undirected\n ? typeof sourceData.undirected[target] !== 'undefined'\n : typeof sourceData.out[target] !== 'undefined')\n ) {\n throw new UsageGraphError(\n `Graph.${name}: an edge linking \"${source}\" to \"${target}\" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.`\n );\n }\n\n // Storing some data\n const edgeData = new EdgeData(\n undirected,\n edge,\n sourceData,\n targetData,\n attributes\n );\n\n // Adding the edge to the internal register\n graph._edges.set(edge, edgeData);\n\n // Incrementing node degree counters\n const isSelfLoop = source === target;\n\n if (undirected) {\n sourceData.undirectedDegree++;\n targetData.undirectedDegree++;\n\n if (isSelfLoop) {\n sourceData.undirectedLoops++;\n graph._undirectedSelfLoopCount++;\n }\n } else {\n sourceData.outDegree++;\n targetData.inDegree++;\n\n if (isSelfLoop) {\n sourceData.directedLoops++;\n graph._directedSelfLoopCount++;\n }\n }\n\n // Updating relevant index\n if (graph.multi) edgeData.attachMulti();\n else edgeData.attach();\n\n if (undirected) graph._undirectedSize++;\n else graph._directedSize++;\n\n // Emitting\n eventData.key = edge;\n\n graph.emit('edgeAdded', eventData);\n\n return edge;\n}\n\n/**\n * Internal method used to add an arbitrary edge to the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {string} name - Name of the child method for errors.\n * @param {boolean} mustGenerateKey - Should the graph generate an id?\n * @param {boolean} undirected - Whether the edge is undirected.\n * @param {any} edge - The edge's key.\n * @param {any} source - The source node.\n * @param {any} target - The target node.\n * @param {object} [attributes] - Optional attributes.\n * @param {boolean} [asUpdater] - Are we updating or merging?\n * @return {any} - The edge.\n *\n * @throws {Error} - Will throw if the graph is of the wrong type.\n * @throws {Error} - Will throw if the given attributes are not an object.\n * @throws {Error} - Will throw if source or target doesn't exist.\n * @throws {Error} - Will throw if the edge already exist.\n */\nfunction mergeEdge(\n graph,\n name,\n mustGenerateKey,\n undirected,\n edge,\n source,\n target,\n attributes,\n asUpdater\n) {\n // Checking validity of operation\n if (!undirected && graph.type === 'undirected')\n throw new UsageGraphError(\n `Graph.${name}: you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.`\n );\n\n if (undirected && graph.type === 'directed')\n throw new UsageGraphError(\n `Graph.${name}: you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.`\n );\n\n if (attributes) {\n if (asUpdater) {\n if (typeof attributes !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.${name}: invalid updater function. Expecting a function but got \"${attributes}\"`\n );\n } else {\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.${name}: invalid attributes. Expecting an object but got \"${attributes}\"`\n );\n }\n }\n\n // Coercion of source & target:\n source = '' + source;\n target = '' + target;\n\n let updater;\n\n if (asUpdater) {\n updater = attributes;\n attributes = undefined;\n }\n\n if (!graph.allowSelfLoops && source === target)\n throw new UsageGraphError(\n `Graph.${name}: source & target are the same (\"${source}\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.`\n );\n\n let sourceData = graph._nodes.get(source);\n let targetData = graph._nodes.get(target);\n let edgeData;\n\n // Do we need to handle duplicate?\n let alreadyExistingEdgeData;\n\n if (!mustGenerateKey) {\n edgeData = graph._edges.get(edge);\n\n if (edgeData) {\n // Here, we need to ensure, if the user gave a key, that source & target\n // are consistent\n if (edgeData.source.key !== source || edgeData.target.key !== target) {\n // If source or target inconsistent\n if (\n !undirected ||\n edgeData.source.key !== target ||\n edgeData.target.key !== source\n ) {\n // If directed, or source/target aren't flipped\n throw new UsageGraphError(\n `Graph.${name}: inconsistency detected when attempting to merge the \"${edge}\" edge with \"${source}\" source & \"${target}\" target vs. (\"${edgeData.source.key}\", \"${edgeData.target.key}\").`\n );\n }\n }\n\n alreadyExistingEdgeData = edgeData;\n }\n }\n\n // Here, we might have a source / target collision\n if (!alreadyExistingEdgeData && !graph.multi && sourceData) {\n alreadyExistingEdgeData = undirected\n ? sourceData.undirected[target]\n : sourceData.out[target];\n }\n\n // Handling duplicates\n if (alreadyExistingEdgeData) {\n const info = [alreadyExistingEdgeData.key, false, false, false];\n\n // We can skip the attribute merging part if the user did not provide them\n if (asUpdater ? !updater : !attributes) return info;\n\n // Updating the attributes\n if (asUpdater) {\n const oldAttributes = alreadyExistingEdgeData.attributes;\n alreadyExistingEdgeData.attributes = updater(oldAttributes);\n\n graph.emit('edgeAttributesUpdated', {\n type: 'replace',\n key: alreadyExistingEdgeData.key,\n attributes: alreadyExistingEdgeData.attributes\n });\n }\n\n // Merging the attributes\n else {\n assign(alreadyExistingEdgeData.attributes, attributes);\n\n graph.emit('edgeAttributesUpdated', {\n type: 'merge',\n key: alreadyExistingEdgeData.key,\n attributes: alreadyExistingEdgeData.attributes,\n data: attributes\n });\n }\n\n return info;\n }\n\n attributes = attributes || {};\n\n if (asUpdater && updater) attributes = updater(attributes);\n\n // Must the graph generate an id for this edge?\n const eventData = {\n key: null,\n undirected,\n source,\n target,\n attributes\n };\n\n if (mustGenerateKey) {\n // NOTE: in this case we can guarantee that the key does not already\n // exist and is already correctly casted as a string\n edge = graph._edgeKeyGenerator();\n } else {\n // Coercion of edge key\n edge = '' + edge;\n\n // Here, we have a key collision\n if (graph._edges.has(edge))\n throw new UsageGraphError(\n `Graph.${name}: the \"${edge}\" edge already exists in the graph.`\n );\n }\n\n let sourceWasAdded = false;\n let targetWasAdded = false;\n\n if (!sourceData) {\n sourceData = unsafeAddNode(graph, source, {});\n sourceWasAdded = true;\n\n if (source === target) {\n targetData = sourceData;\n targetWasAdded = true;\n }\n }\n if (!targetData) {\n targetData = unsafeAddNode(graph, target, {});\n targetWasAdded = true;\n }\n\n // Storing some data\n edgeData = new EdgeData(undirected, edge, sourceData, targetData, attributes);\n\n // Adding the edge to the internal register\n graph._edges.set(edge, edgeData);\n\n // Incrementing node degree counters\n const isSelfLoop = source === target;\n\n if (undirected) {\n sourceData.undirectedDegree++;\n targetData.undirectedDegree++;\n\n if (isSelfLoop) {\n sourceData.undirectedLoops++;\n graph._undirectedSelfLoopCount++;\n }\n } else {\n sourceData.outDegree++;\n targetData.inDegree++;\n\n if (isSelfLoop) {\n sourceData.directedLoops++;\n graph._directedSelfLoopCount++;\n }\n }\n\n // Updating relevant index\n if (graph.multi) edgeData.attachMulti();\n else edgeData.attach();\n\n if (undirected) graph._undirectedSize++;\n else graph._directedSize++;\n\n // Emitting\n eventData.key = edge;\n\n graph.emit('edgeAdded', eventData);\n\n return [edge, true, sourceWasAdded, targetWasAdded];\n}\n\n/**\n * Internal method used to drop an edge.\n *\n * @param {Graph} graph - Target graph.\n * @param {EdgeData} edgeData - Data of the edge to drop.\n */\nfunction dropEdgeFromData(graph, edgeData) {\n // Dropping the edge from the register\n graph._edges.delete(edgeData.key);\n\n // Updating related degrees\n const {source: sourceData, target: targetData, attributes} = edgeData;\n\n const undirected = edgeData.undirected;\n\n const isSelfLoop = sourceData === targetData;\n\n if (undirected) {\n sourceData.undirectedDegree--;\n targetData.undirectedDegree--;\n\n if (isSelfLoop) {\n sourceData.undirectedLoops--;\n graph._undirectedSelfLoopCount--;\n }\n } else {\n sourceData.outDegree--;\n targetData.inDegree--;\n\n if (isSelfLoop) {\n sourceData.directedLoops--;\n graph._directedSelfLoopCount--;\n }\n }\n\n // Clearing index\n if (graph.multi) edgeData.detachMulti();\n else edgeData.detach();\n\n if (undirected) graph._undirectedSize--;\n else graph._directedSize--;\n\n // Emitting\n graph.emit('edgeDropped', {\n key: edgeData.key,\n attributes,\n source: sourceData.key,\n target: targetData.key,\n undirected\n });\n}\n\n/**\n * Graph class\n *\n * @constructor\n * @param {object} [options] - Options:\n * @param {boolean} [allowSelfLoops] - Allow self loops?\n * @param {string} [type] - Type of the graph.\n * @param {boolean} [map] - Allow references as keys?\n * @param {boolean} [multi] - Allow parallel edges?\n *\n * @throws {Error} - Will throw if the arguments are not valid.\n */\nexport default class Graph extends EventEmitter {\n constructor(options) {\n super();\n\n //-- Solving options\n options = assign({}, DEFAULTS, options);\n\n // Enforcing options validity\n if (typeof options.multi !== 'boolean')\n throw new InvalidArgumentsGraphError(\n `Graph.constructor: invalid 'multi' option. Expecting a boolean but got \"${options.multi}\".`\n );\n\n if (!TYPES.has(options.type))\n throw new InvalidArgumentsGraphError(\n `Graph.constructor: invalid 'type' option. Should be one of \"mixed\", \"directed\" or \"undirected\" but got \"${options.type}\".`\n );\n\n if (typeof options.allowSelfLoops !== 'boolean')\n throw new InvalidArgumentsGraphError(\n `Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got \"${options.allowSelfLoops}\".`\n );\n\n //-- Private properties\n\n // Utilities\n const NodeDataClass =\n options.type === 'mixed'\n ? MixedNodeData\n : options.type === 'directed'\n ? DirectedNodeData\n : UndirectedNodeData;\n\n privateProperty(this, 'NodeDataClass', NodeDataClass);\n\n // Internal edge key generator\n\n // NOTE: this internal generator produce keys that are strings\n // composed of a weird prefix, an incremental instance id starting from\n // a random byte and finally an internal instance incremental id.\n // All this to avoid intra-frame and cross-frame adversarial inputs\n // that can force a single #.addEdge call to degenerate into a O(n)\n // available key search loop.\n\n // It also ensures that automatically generated edge keys are unlikely\n // to produce collisions with arbitrary keys given by users.\n const instancePrefix = 'geid_' + INSTANCE_ID() + '_';\n let edgeId = 0;\n\n const edgeKeyGenerator = () => {\n let availableEdgeKey;\n\n do {\n availableEdgeKey = instancePrefix + edgeId++;\n } while (this._edges.has(availableEdgeKey));\n\n return availableEdgeKey;\n };\n\n // Indexes\n privateProperty(this, '_attributes', {});\n privateProperty(this, '_nodes', new Map());\n privateProperty(this, '_edges', new Map());\n privateProperty(this, '_directedSize', 0);\n privateProperty(this, '_undirectedSize', 0);\n privateProperty(this, '_directedSelfLoopCount', 0);\n privateProperty(this, '_undirectedSelfLoopCount', 0);\n privateProperty(this, '_edgeKeyGenerator', edgeKeyGenerator);\n\n // Options\n privateProperty(this, '_options', options);\n\n // Emitter properties\n EMITTER_PROPS.forEach(prop => privateProperty(this, prop, this[prop]));\n\n //-- Properties readers\n readOnlyProperty(this, 'order', () => this._nodes.size);\n readOnlyProperty(this, 'size', () => this._edges.size);\n readOnlyProperty(this, 'directedSize', () => this._directedSize);\n readOnlyProperty(this, 'undirectedSize', () => this._undirectedSize);\n readOnlyProperty(\n this,\n 'selfLoopCount',\n () => this._directedSelfLoopCount + this._undirectedSelfLoopCount\n );\n readOnlyProperty(\n this,\n 'directedSelfLoopCount',\n () => this._directedSelfLoopCount\n );\n readOnlyProperty(\n this,\n 'undirectedSelfLoopCount',\n () => this._undirectedSelfLoopCount\n );\n readOnlyProperty(this, 'multi', this._options.multi);\n readOnlyProperty(this, 'type', this._options.type);\n readOnlyProperty(this, 'allowSelfLoops', this._options.allowSelfLoops);\n readOnlyProperty(this, 'implementation', () => 'graphology');\n }\n\n _resetInstanceCounters() {\n this._directedSize = 0;\n this._undirectedSize = 0;\n this._directedSelfLoopCount = 0;\n this._undirectedSelfLoopCount = 0;\n }\n\n /**---------------------------------------------------------------------------\n * Read\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method returning whether the given node is found in the graph.\n *\n * @param {any} node - The node.\n * @return {boolean}\n */\n hasNode(node) {\n return this._nodes.has('' + node);\n }\n\n /**\n * Method returning whether the given directed edge is found in the graph.\n *\n * Arity 1:\n * @param {any} edge - The edge's key.\n *\n * Arity 2:\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the arguments are invalid.\n */\n hasDirectedEdge(source, target) {\n // Early termination\n if (this.type === 'undirected') return false;\n\n if (arguments.length === 1) {\n const edge = '' + source;\n\n const edgeData = this._edges.get(edge);\n\n return !!edgeData && !edgeData.undirected;\n } else if (arguments.length === 2) {\n source = '' + source;\n target = '' + target;\n\n // If the node source or the target is not in the graph we break\n const nodeData = this._nodes.get(source);\n\n if (!nodeData) return false;\n\n // Is there a directed edge pointing toward target?\n return nodeData.out.hasOwnProperty(target);\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`\n );\n }\n\n /**\n * Method returning whether the given undirected edge is found in the graph.\n *\n * Arity 1:\n * @param {any} edge - The edge's key.\n *\n * Arity 2:\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the arguments are invalid.\n */\n hasUndirectedEdge(source, target) {\n // Early termination\n if (this.type === 'directed') return false;\n\n if (arguments.length === 1) {\n const edge = '' + source;\n\n const edgeData = this._edges.get(edge);\n\n return !!edgeData && edgeData.undirected;\n } else if (arguments.length === 2) {\n source = '' + source;\n target = '' + target;\n\n // If the node source or the target is not in the graph we break\n const nodeData = this._nodes.get(source);\n\n if (!nodeData) return false;\n\n // Is there a directed edge pointing toward target?\n return nodeData.undirected.hasOwnProperty(target);\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.hasDirectedEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`\n );\n }\n\n /**\n * Method returning whether the given edge is found in the graph.\n *\n * Arity 1:\n * @param {any} edge - The edge's key.\n *\n * Arity 2:\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the arguments are invalid.\n */\n hasEdge(source, target) {\n if (arguments.length === 1) {\n const edge = '' + source;\n\n return this._edges.has(edge);\n } else if (arguments.length === 2) {\n source = '' + source;\n target = '' + target;\n\n // If the node source or the target is not in the graph we break\n const nodeData = this._nodes.get(source);\n\n if (!nodeData) return false;\n\n // Is there a directed edge pointing toward target?\n return (\n (typeof nodeData.out !== 'undefined' &&\n nodeData.out.hasOwnProperty(target)) ||\n (typeof nodeData.undirected !== 'undefined' &&\n nodeData.undirected.hasOwnProperty(target))\n );\n }\n\n throw new InvalidArgumentsGraphError(\n `Graph.hasEdge: invalid arity (${arguments.length}, instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.`\n );\n }\n\n /**\n * Method returning the edge matching source & target in a directed fashion.\n *\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {any|undefined}\n *\n * @throws {Error} - Will throw if the graph is multi.\n * @throws {Error} - Will throw if source or target doesn't exist.\n */\n directedEdge(source, target) {\n if (this.type === 'undirected') return;\n\n source = '' + source;\n target = '' + target;\n\n if (this.multi)\n throw new UsageGraphError(\n 'Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.'\n );\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.directedEdge: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.directedEdge: could not find the \"${target}\" target node in the graph.`\n );\n\n const edgeData = (sourceData.out && sourceData.out[target]) || undefined;\n\n if (edgeData) return edgeData.key;\n }\n\n /**\n * Method returning the edge matching source & target in a undirected fashion.\n *\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {any|undefined}\n *\n * @throws {Error} - Will throw if the graph is multi.\n * @throws {Error} - Will throw if source or target doesn't exist.\n */\n undirectedEdge(source, target) {\n if (this.type === 'directed') return;\n\n source = '' + source;\n target = '' + target;\n\n if (this.multi)\n throw new UsageGraphError(\n 'Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.'\n );\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.undirectedEdge: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.undirectedEdge: could not find the \"${target}\" target node in the graph.`\n );\n\n const edgeData =\n (sourceData.undirected && sourceData.undirected[target]) || undefined;\n\n if (edgeData) return edgeData.key;\n }\n\n /**\n * Method returning the edge matching source & target in a mixed fashion.\n *\n * @param {any} source - The edge's source.\n * @param {any} target - The edge's target.\n *\n * @return {any|undefined}\n *\n * @throws {Error} - Will throw if the graph is multi.\n * @throws {Error} - Will throw if source or target doesn't exist.\n */\n edge(source, target) {\n if (this.multi)\n throw new UsageGraphError(\n 'Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.'\n );\n\n source = '' + source;\n target = '' + target;\n\n const sourceData = this._nodes.get(source);\n\n if (!sourceData)\n throw new NotFoundGraphError(\n `Graph.edge: could not find the \"${source}\" source node in the graph.`\n );\n\n if (!this._nodes.has(target))\n throw new NotFoundGraphError(\n `Graph.edge: could not find the \"${target}\" target node in the graph.`\n );\n\n const edgeData =\n (sourceData.out && sourceData.out[target]) ||\n (sourceData.undirected && sourceData.undirected[target]) ||\n undefined;\n\n if (edgeData) return edgeData.key;\n }\n\n /**\n * Method returning whether two nodes are directed neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areDirectedNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areDirectedNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return false;\n\n return neighbor in nodeData.in || neighbor in nodeData.out;\n }\n\n /**\n * Method returning whether two nodes are out neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areOutNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areOutNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return false;\n\n return neighbor in nodeData.out;\n }\n\n /**\n * Method returning whether two nodes are in neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areInNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areInNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return false;\n\n return neighbor in nodeData.in;\n }\n\n /**\n * Method returning whether two nodes are undirected neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areUndirectedNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areUndirectedNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'directed') return false;\n\n return neighbor in nodeData.undirected;\n }\n\n /**\n * Method returning whether two nodes are neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type !== 'undirected') {\n if (neighbor in nodeData.in || neighbor in nodeData.out) return true;\n }\n\n if (this.type !== 'directed') {\n if (neighbor in nodeData.undirected) return true;\n }\n\n return false;\n }\n\n /**\n * Method returning whether two nodes are inbound neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areInboundNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areInboundNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type !== 'undirected') {\n if (neighbor in nodeData.in) return true;\n }\n\n if (this.type !== 'directed') {\n if (neighbor in nodeData.undirected) return true;\n }\n\n return false;\n }\n\n /**\n * Method returning whether two nodes are outbound neighbors.\n *\n * @param {any} node - The node's key.\n * @param {any} neighbor - The neighbor's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n areOutboundNeighbors(node, neighbor) {\n node = '' + node;\n neighbor = '' + neighbor;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.areOutboundNeighbors: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type !== 'undirected') {\n if (neighbor in nodeData.out) return true;\n }\n\n if (this.type !== 'directed') {\n if (neighbor in nodeData.undirected) return true;\n }\n\n return false;\n }\n\n /**\n * Method returning the given node's in degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n inDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.inDegree: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.inDegree;\n }\n\n /**\n * Method returning the given node's out degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n outDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.outDegree: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.outDegree;\n }\n\n /**\n * Method returning the given node's directed degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n directedDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.directedDegree: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.inDegree + nodeData.outDegree;\n }\n\n /**\n * Method returning the given node's undirected degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n undirectedDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.undirectedDegree: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'directed') return 0;\n\n return nodeData.undirectedDegree;\n }\n\n /**\n * Method returning the given node's inbound degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's inbound degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n inboundDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.inboundDegree: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.inDegree;\n }\n\n return degree;\n }\n\n /**\n * Method returning the given node's outbound degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's outbound degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n outboundDegree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.outboundDegree: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.outDegree;\n }\n\n return degree;\n }\n\n /**\n * Method returning the given node's directed degree.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n degree(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.degree: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.inDegree + nodeData.outDegree;\n }\n\n return degree;\n }\n\n /**\n * Method returning the given node's in degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n inDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.inDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.inDegree - nodeData.directedLoops;\n }\n\n /**\n * Method returning the given node's out degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n outDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.outDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.outDegree - nodeData.directedLoops;\n }\n\n /**\n * Method returning the given node's directed degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n directedDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.directedDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'undirected') return 0;\n\n return nodeData.inDegree + nodeData.outDegree - nodeData.directedLoops * 2;\n }\n\n /**\n * Method returning the given node's undirected degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's in degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n undirectedDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.undirectedDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n if (this.type === 'directed') return 0;\n\n return nodeData.undirectedDegree - nodeData.undirectedLoops * 2;\n }\n\n /**\n * Method returning the given node's inbound degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's inbound degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n inboundDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.inboundDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n let loops = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n loops += nodeData.undirectedLoops * 2;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.inDegree;\n loops += nodeData.directedLoops;\n }\n\n return degree - loops;\n }\n\n /**\n * Method returning the given node's outbound degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's outbound degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n outboundDegreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.outboundDegreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n let loops = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n loops += nodeData.undirectedLoops * 2;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.outDegree;\n loops += nodeData.directedLoops;\n }\n\n return degree - loops;\n }\n\n /**\n * Method returning the given node's directed degree without considering self loops.\n *\n * @param {any} node - The node's key.\n * @return {number} - The node's degree.\n *\n * @throws {Error} - Will throw if the node isn't in the graph.\n */\n degreeWithoutSelfLoops(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.degreeWithoutSelfLoops: could not find the \"${node}\" node in the graph.`\n );\n\n let degree = 0;\n let loops = 0;\n\n if (this.type !== 'directed') {\n degree += nodeData.undirectedDegree;\n loops += nodeData.undirectedLoops * 2;\n }\n\n if (this.type !== 'undirected') {\n degree += nodeData.inDegree + nodeData.outDegree;\n loops += nodeData.directedLoops * 2;\n }\n\n return degree - loops;\n }\n\n /**\n * Method returning the given edge's source.\n *\n * @param {any} edge - The edge's key.\n * @return {any} - The edge's source.\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n source(edge) {\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.source: could not find the \"${edge}\" edge in the graph.`\n );\n\n return data.source.key;\n }\n\n /**\n * Method returning the given edge's target.\n *\n * @param {any} edge - The edge's key.\n * @return {any} - The edge's target.\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n target(edge) {\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.target: could not find the \"${edge}\" edge in the graph.`\n );\n\n return data.target.key;\n }\n\n /**\n * Method returning the given edge's extremities.\n *\n * @param {any} edge - The edge's key.\n * @return {array} - The edge's extremities.\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n extremities(edge) {\n edge = '' + edge;\n\n const edgeData = this._edges.get(edge);\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.extremities: could not find the \"${edge}\" edge in the graph.`\n );\n\n return [edgeData.source.key, edgeData.target.key];\n }\n\n /**\n * Given a node & an edge, returns the other extremity of the edge.\n *\n * @param {any} node - The node's key.\n * @param {any} edge - The edge's key.\n * @return {any} - The related node.\n *\n * @throws {Error} - Will throw if the edge isn't in the graph or if the\n * edge & node are not related.\n */\n opposite(node, edge) {\n node = '' + node;\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.opposite: could not find the \"${edge}\" edge in the graph.`\n );\n\n const source = data.source.key;\n const target = data.target.key;\n\n if (node === source) return target;\n if (node === target) return source;\n\n throw new NotFoundGraphError(\n `Graph.opposite: the \"${node}\" node is not attached to the \"${edge}\" edge (${source}, ${target}).`\n );\n }\n\n /**\n * Returns whether the given edge has the given node as extremity.\n *\n * @param {any} edge - The edge's key.\n * @param {any} node - The node's key.\n * @return {boolean} - The related node.\n *\n * @throws {Error} - Will throw if either the node or the edge isn't in the graph.\n */\n hasExtremity(edge, node) {\n edge = '' + edge;\n node = '' + node;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.hasExtremity: could not find the \"${edge}\" edge in the graph.`\n );\n\n return data.source.key === node || data.target.key === node;\n }\n\n /**\n * Method returning whether the given edge is undirected.\n *\n * @param {any} edge - The edge's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n isUndirected(edge) {\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.isUndirected: could not find the \"${edge}\" edge in the graph.`\n );\n\n return data.undirected;\n }\n\n /**\n * Method returning whether the given edge is directed.\n *\n * @param {any} edge - The edge's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n isDirected(edge) {\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.isDirected: could not find the \"${edge}\" edge in the graph.`\n );\n\n return !data.undirected;\n }\n\n /**\n * Method returning whether the given edge is a self loop.\n *\n * @param {any} edge - The edge's key.\n * @return {boolean}\n *\n * @throws {Error} - Will throw if the edge isn't in the graph.\n */\n isSelfLoop(edge) {\n edge = '' + edge;\n\n const data = this._edges.get(edge);\n\n if (!data)\n throw new NotFoundGraphError(\n `Graph.isSelfLoop: could not find the \"${edge}\" edge in the graph.`\n );\n\n return data.source === data.target;\n }\n\n /**---------------------------------------------------------------------------\n * Mutation\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method used to add a node to the graph.\n *\n * @param {any} node - The node.\n * @param {object} [attributes] - Optional attributes.\n * @return {any} - The node.\n *\n * @throws {Error} - Will throw if the given node already exist.\n * @throws {Error} - Will throw if the given attributes are not an object.\n */\n addNode(node, attributes) {\n const nodeData = addNode(this, node, attributes);\n\n return nodeData.key;\n }\n\n /**\n * Method used to merge a node into the graph.\n *\n * @param {any} node - The node.\n * @param {object} [attributes] - Optional attributes.\n * @return {any} - The node.\n */\n mergeNode(node, attributes) {\n if (attributes && !isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n `Graph.mergeNode: invalid attributes. Expecting an object but got \"${attributes}\"`\n );\n\n // String coercion\n node = '' + node;\n attributes = attributes || {};\n\n // If the node already exists, we merge the attributes\n let data = this._nodes.get(node);\n\n if (data) {\n if (attributes) {\n assign(data.attributes, attributes);\n\n this.emit('nodeAttributesUpdated', {\n type: 'merge',\n key: node,\n attributes: data.attributes,\n data: attributes\n });\n }\n return [node, false];\n }\n\n data = new this.NodeDataClass(node, attributes);\n\n // Adding the node to internal register\n this._nodes.set(node, data);\n\n // Emitting\n this.emit('nodeAdded', {\n key: node,\n attributes\n });\n\n return [node, true];\n }\n\n /**\n * Method used to add a node if it does not exist in the graph or else to\n * update its attributes using a function.\n *\n * @param {any} node - The node.\n * @param {function} [updater] - Optional updater function.\n * @return {any} - The node.\n */\n updateNode(node, updater) {\n if (updater && typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n `Graph.updateNode: invalid updater function. Expecting a function but got \"${updater}\"`\n );\n\n // String coercion\n node = '' + node;\n\n // If the node already exists, we update the attributes\n let data = this._nodes.get(node);\n\n if (data) {\n if (updater) {\n const oldAttributes = data.attributes;\n data.attributes = updater(oldAttributes);\n\n this.emit('nodeAttributesUpdated', {\n type: 'replace',\n key: node,\n attributes: data.attributes\n });\n }\n return [node, false];\n }\n\n const attributes = updater ? updater({}) : {};\n\n data = new this.NodeDataClass(node, attributes);\n\n // Adding the node to internal register\n this._nodes.set(node, data);\n\n // Emitting\n this.emit('nodeAdded', {\n key: node,\n attributes\n });\n\n return [node, true];\n }\n\n /**\n * Method used to drop a single node & all its attached edges from the graph.\n *\n * @param {any} node - The node.\n * @return {Graph}\n *\n * @throws {Error} - Will throw if the node doesn't exist.\n */\n dropNode(node) {\n node = '' + node;\n\n const nodeData = this._nodes.get(node);\n\n if (!nodeData)\n throw new NotFoundGraphError(\n `Graph.dropNode: could not find the \"${node}\" node in the graph.`\n );\n\n let edgeData;\n\n // Removing attached edges\n // NOTE: we could be faster here, but this is such a pain to maintain\n if (this.type !== 'undirected') {\n for (const neighbor in nodeData.out) {\n edgeData = nodeData.out[neighbor];\n\n do {\n dropEdgeFromData(this, edgeData);\n edgeData = edgeData.next;\n } while (edgeData);\n }\n\n for (const neighbor in nodeData.in) {\n edgeData = nodeData.in[neighbor];\n\n do {\n dropEdgeFromData(this, edgeData);\n edgeData = edgeData.next;\n } while (edgeData);\n }\n }\n\n if (this.type !== 'directed') {\n for (const neighbor in nodeData.undirected) {\n edgeData = nodeData.undirected[neighbor];\n\n do {\n dropEdgeFromData(this, edgeData);\n edgeData = edgeData.next;\n } while (edgeData);\n }\n }\n\n // Dropping the node from the register\n this._nodes.delete(node);\n\n // Emitting\n this.emit('nodeDropped', {\n key: node,\n attributes: nodeData.attributes\n });\n }\n\n /**\n * Method used to drop a single edge from the graph.\n *\n * Arity 1:\n * @param {any} edge - The edge.\n *\n * Arity 2:\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n *\n * @return {Graph}\n *\n * @throws {Error} - Will throw if the edge doesn't exist.\n */\n dropEdge(edge) {\n let edgeData;\n\n if (arguments.length > 1) {\n const source = '' + arguments[0];\n const target = '' + arguments[1];\n\n edgeData = getMatchingEdge(this, source, target, this.type);\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.dropEdge: could not find the \"${source}\" -> \"${target}\" edge in the graph.`\n );\n } else {\n edge = '' + edge;\n\n edgeData = this._edges.get(edge);\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.dropEdge: could not find the \"${edge}\" edge in the graph.`\n );\n }\n\n dropEdgeFromData(this, edgeData);\n\n return this;\n }\n\n /**\n * Method used to drop a single directed edge from the graph.\n *\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n *\n * @return {Graph}\n *\n * @throws {Error} - Will throw if the edge doesn't exist.\n */\n dropDirectedEdge(source, target) {\n if (arguments.length < 2)\n throw new UsageGraphError(\n 'Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.'\n );\n\n if (this.multi)\n throw new UsageGraphError(\n 'Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.'\n );\n\n source = '' + source;\n target = '' + target;\n\n const edgeData = getMatchingEdge(this, source, target, 'directed');\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.dropDirectedEdge: could not find a \"${source}\" -> \"${target}\" edge in the graph.`\n );\n\n dropEdgeFromData(this, edgeData);\n\n return this;\n }\n\n /**\n * Method used to drop a single undirected edge from the graph.\n *\n * @param {any} source - Source node.\n * @param {any} target - Target node.\n *\n * @return {Graph}\n *\n * @throws {Error} - Will throw if the edge doesn't exist.\n */\n dropUndirectedEdge(source, target) {\n if (arguments.length < 2)\n throw new UsageGraphError(\n 'Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.'\n );\n\n if (this.multi)\n throw new UsageGraphError(\n 'Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.'\n );\n\n const edgeData = getMatchingEdge(this, source, target, 'undirected');\n\n if (!edgeData)\n throw new NotFoundGraphError(\n `Graph.dropUndirectedEdge: could not find a \"${source}\" -> \"${target}\" edge in the graph.`\n );\n\n dropEdgeFromData(this, edgeData);\n\n return this;\n }\n\n /**\n * Method used to remove every edge & every node from the graph.\n *\n * @return {Graph}\n */\n clear() {\n // Clearing edges\n this._edges.clear();\n\n // Clearing nodes\n this._nodes.clear();\n\n // Reset counters\n this._resetInstanceCounters();\n\n // Emitting\n this.emit('cleared');\n }\n\n /**\n * Method used to remove every edge from the graph.\n *\n * @return {Graph}\n */\n clearEdges() {\n // Clearing structure index\n const iterator = this._nodes.values();\n\n let step;\n\n while (((step = iterator.next()), step.done !== true)) {\n step.value.clear();\n }\n\n // Clearing edges\n this._edges.clear();\n\n // Reset counters\n this._resetInstanceCounters();\n\n // Emitting\n this.emit('edgesCleared');\n }\n\n /**---------------------------------------------------------------------------\n * Attributes-related methods\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method returning the desired graph's attribute.\n *\n * @param {string} name - Name of the attribute.\n * @return {any}\n */\n getAttribute(name) {\n return this._attributes[name];\n }\n\n /**\n * Method returning the graph's attributes.\n *\n * @return {object}\n */\n getAttributes() {\n return this._attributes;\n }\n\n /**\n * Method returning whether the graph has the desired attribute.\n *\n * @param {string} name - Name of the attribute.\n * @return {boolean}\n */\n hasAttribute(name) {\n return this._attributes.hasOwnProperty(name);\n }\n\n /**\n * Method setting a value for the desired graph's attribute.\n *\n * @param {string} name - Name of the attribute.\n * @param {any} value - Value for the attribute.\n * @return {Graph}\n */\n setAttribute(name, value) {\n this._attributes[name] = value;\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'set',\n attributes: this._attributes,\n name\n });\n\n return this;\n }\n\n /**\n * Method using a function to update the desired graph's attribute's value.\n *\n * @param {string} name - Name of the attribute.\n * @param {function} updater - Function use to update the attribute's value.\n * @return {Graph}\n */\n updateAttribute(name, updater) {\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.updateAttribute: updater should be a function.'\n );\n\n const value = this._attributes[name];\n\n this._attributes[name] = updater(value);\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'set',\n attributes: this._attributes,\n name\n });\n\n return this;\n }\n\n /**\n * Method removing the desired graph's attribute.\n *\n * @param {string} name - Name of the attribute.\n * @return {Graph}\n */\n removeAttribute(name) {\n delete this._attributes[name];\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'remove',\n attributes: this._attributes,\n name\n });\n\n return this;\n }\n\n /**\n * Method replacing the graph's attributes.\n *\n * @param {object} attributes - New attributes.\n * @return {Graph}\n *\n * @throws {Error} - Will throw if given attributes are not a plain object.\n */\n replaceAttributes(attributes) {\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n 'Graph.replaceAttributes: provided attributes are not a plain object.'\n );\n\n this._attributes = attributes;\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'replace',\n attributes: this._attributes\n });\n\n return this;\n }\n\n /**\n * Method merging the graph's attributes.\n *\n * @param {object} attributes - Attributes to merge.\n * @return {Graph}\n *\n * @throws {Error} - Will throw if given attributes are not a plain object.\n */\n mergeAttributes(attributes) {\n if (!isPlainObject(attributes))\n throw new InvalidArgumentsGraphError(\n 'Graph.mergeAttributes: provided attributes are not a plain object.'\n );\n\n assign(this._attributes, attributes);\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'merge',\n attributes: this._attributes,\n data: attributes\n });\n\n return this;\n }\n\n /**\n * Method updating the graph's attributes.\n *\n * @param {function} updater - Function used to update the attributes.\n * @return {Graph}\n *\n * @throws {Error} - Will throw if given updater is not a function.\n */\n updateAttributes(updater) {\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.updateAttributes: provided updater is not a function.'\n );\n\n this._attributes = updater(this._attributes);\n\n // Emitting\n this.emit('attributesUpdated', {\n type: 'update',\n attributes: this._attributes\n });\n\n return this;\n }\n\n /**\n * Method used to update each node's attributes using the given function.\n *\n * @param {function} updater - Updater function to use.\n * @param {object} [hints] - Optional hints.\n */\n updateEachNodeAttributes(updater, hints) {\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.updateEachNodeAttributes: expecting an updater function.'\n );\n\n if (hints && !validateHints(hints))\n throw new InvalidArgumentsGraphError(\n 'Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n nodeData.attributes = updater(nodeData.key, nodeData.attributes);\n }\n\n this.emit('eachNodeAttributesUpdated', {\n hints: hints ? hints : null\n });\n }\n\n /**\n * Method used to update each edge's attributes using the given function.\n *\n * @param {function} updater - Updater function to use.\n * @param {object} [hints] - Optional hints.\n */\n updateEachEdgeAttributes(updater, hints) {\n if (typeof updater !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.updateEachEdgeAttributes: expecting an updater function.'\n );\n\n if (hints && !validateHints(hints))\n throw new InvalidArgumentsGraphError(\n 'Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}'\n );\n\n const iterator = this._edges.values();\n\n let step, edgeData, sourceData, targetData;\n\n while (((step = iterator.next()), step.done !== true)) {\n edgeData = step.value;\n sourceData = edgeData.source;\n targetData = edgeData.target;\n\n edgeData.attributes = updater(\n edgeData.key,\n edgeData.attributes,\n sourceData.key,\n targetData.key,\n sourceData.attributes,\n targetData.attributes,\n edgeData.undirected\n );\n }\n\n this.emit('eachEdgeAttributesUpdated', {\n hints: hints ? hints : null\n });\n }\n\n /**---------------------------------------------------------------------------\n * Iteration-related methods\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method iterating over the graph's adjacency using the given callback.\n *\n * @param {function} callback - Callback to use.\n */\n forEachAdjacencyEntry(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.forEachAdjacencyEntry: expecting a callback.'\n );\n\n forEachAdjacency(false, false, false, this, callback);\n }\n forEachAdjacencyEntryWithOrphans(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.'\n );\n\n forEachAdjacency(false, false, true, this, callback);\n }\n\n /**\n * Method iterating over the graph's assymetric adjacency using the given callback.\n *\n * @param {function} callback - Callback to use.\n */\n forEachAssymetricAdjacencyEntry(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.forEachAssymetricAdjacencyEntry: expecting a callback.'\n );\n\n forEachAdjacency(false, true, false, this, callback);\n }\n forEachAssymetricAdjacencyEntryWithOrphans(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.'\n );\n\n forEachAdjacency(false, true, true, this, callback);\n }\n\n /**\n * Method returning the list of the graph's nodes.\n *\n * @return {array} - The nodes.\n */\n nodes() {\n if (typeof Array.from === 'function') return Array.from(this._nodes.keys());\n\n return take(this._nodes.keys(), this._nodes.size);\n }\n\n /**\n * Method iterating over the graph's nodes using the given callback.\n *\n * @param {function} callback - Callback (key, attributes, index).\n */\n forEachNode(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.forEachNode: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n callback(nodeData.key, nodeData.attributes);\n }\n }\n\n /**\n * Method iterating attempting to find a node matching the given predicate\n * function.\n *\n * @param {function} callback - Callback (key, attributes).\n */\n findNode(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.findNode: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n\n if (callback(nodeData.key, nodeData.attributes)) return nodeData.key;\n }\n\n return;\n }\n\n /**\n * Method mapping nodes.\n *\n * @param {function} callback - Callback (key, attributes).\n */\n mapNodes(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.mapNode: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n const result = new Array(this.order);\n let i = 0;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n result[i++] = callback(nodeData.key, nodeData.attributes);\n }\n\n return result;\n }\n\n /**\n * Method returning whether some node verify the given predicate.\n *\n * @param {function} callback - Callback (key, attributes).\n */\n someNode(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.someNode: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n\n if (callback(nodeData.key, nodeData.attributes)) return true;\n }\n\n return false;\n }\n\n /**\n * Method returning whether all node verify the given predicate.\n *\n * @param {function} callback - Callback (key, attributes).\n */\n everyNode(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.everyNode: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n\n if (!callback(nodeData.key, nodeData.attributes)) return false;\n }\n\n return true;\n }\n\n /**\n * Method filtering nodes.\n *\n * @param {function} callback - Callback (key, attributes).\n */\n filterNodes(callback) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.filterNodes: expecting a callback.'\n );\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n const result = [];\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n\n if (callback(nodeData.key, nodeData.attributes))\n result.push(nodeData.key);\n }\n\n return result;\n }\n\n /**\n * Method reducing nodes.\n *\n * @param {function} callback - Callback (accumulator, key, attributes).\n */\n reduceNodes(callback, initialValue) {\n if (typeof callback !== 'function')\n throw new InvalidArgumentsGraphError(\n 'Graph.reduceNodes: expecting a callback.'\n );\n\n if (arguments.length < 2)\n throw new InvalidArgumentsGraphError(\n 'Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.'\n );\n\n let accumulator = initialValue;\n\n const iterator = this._nodes.values();\n\n let step, nodeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n nodeData = step.value;\n accumulator = callback(accumulator, nodeData.key, nodeData.attributes);\n }\n\n return accumulator;\n }\n\n /**\n * Method returning an iterator over the graph's node entries.\n *\n * @return {Iterator}\n */\n nodeEntries() {\n const iterator = this._nodes.values();\n\n return new Iterator(() => {\n const step = iterator.next();\n\n if (step.done) return step;\n\n const data = step.value;\n\n return {\n value: {node: data.key, attributes: data.attributes},\n done: false\n };\n });\n }\n\n /**---------------------------------------------------------------------------\n * Serialization\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method used to export the whole graph.\n *\n * @return {object} - The serialized graph.\n */\n export() {\n const nodes = new Array(this._nodes.size);\n\n let i = 0;\n\n this._nodes.forEach((data, key) => {\n nodes[i++] = serializeNode(key, data);\n });\n\n const edges = new Array(this._edges.size);\n\n i = 0;\n\n this._edges.forEach((data, key) => {\n edges[i++] = serializeEdge(this.type, key, data);\n });\n\n return {\n options: {\n type: this.type,\n multi: this.multi,\n allowSelfLoops: this.allowSelfLoops\n },\n attributes: this.getAttributes(),\n nodes,\n edges\n };\n }\n\n /**\n * Method used to import a serialized graph.\n *\n * @param {object|Graph} data - The serialized graph.\n * @param {boolean} merge - Whether to merge data.\n * @return {Graph} - Returns itself for chaining.\n */\n import(data, merge = false) {\n // Importing a Graph instance directly\n if (data instanceof Graph) {\n // Nodes\n data.forEachNode((n, a) => {\n if (merge) this.mergeNode(n, a);\n else this.addNode(n, a);\n });\n\n // Edges\n data.forEachEdge((e, a, s, t, _sa, _ta, u) => {\n if (merge) {\n if (u) this.mergeUndirectedEdgeWithKey(e, s, t, a);\n else this.mergeDirectedEdgeWithKey(e, s, t, a);\n } else {\n if (u) this.addUndirectedEdgeWithKey(e, s, t, a);\n else this.addDirectedEdgeWithKey(e, s, t, a);\n }\n });\n\n return this;\n }\n\n // Importing a serialized graph\n if (!isPlainObject(data))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.'\n );\n\n if (data.attributes) {\n if (!isPlainObject(data.attributes))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid attributes. Expecting a plain object.'\n );\n\n if (merge) this.mergeAttributes(data.attributes);\n else this.replaceAttributes(data.attributes);\n }\n\n let i, l, list, node, edge;\n\n if (data.nodes) {\n list = data.nodes;\n\n if (!Array.isArray(list))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid nodes. Expecting an array.'\n );\n\n for (i = 0, l = list.length; i < l; i++) {\n node = list[i];\n\n // Validating\n validateSerializedNode(node);\n\n // Adding the node\n const {key, attributes} = node;\n\n if (merge) this.mergeNode(key, attributes);\n else this.addNode(key, attributes);\n }\n }\n\n if (data.edges) {\n let undirectedByDefault = false;\n\n if (this.type === 'undirected') {\n undirectedByDefault = true;\n }\n\n list = data.edges;\n\n if (!Array.isArray(list))\n throw new InvalidArgumentsGraphError(\n 'Graph.import: invalid edges. Expecting an array.'\n );\n\n for (i = 0, l = list.length; i < l; i++) {\n edge = list[i];\n\n // Validating\n validateSerializedEdge(edge);\n\n // Adding the edge\n const {\n source,\n target,\n attributes,\n undirected = undirectedByDefault\n } = edge;\n\n let method;\n\n if ('key' in edge) {\n method = merge\n ? undirected\n ? this.mergeUndirectedEdgeWithKey\n : this.mergeDirectedEdgeWithKey\n : undirected\n ? this.addUndirectedEdgeWithKey\n : this.addDirectedEdgeWithKey;\n\n method.call(this, edge.key, source, target, attributes);\n } else {\n method = merge\n ? undirected\n ? this.mergeUndirectedEdge\n : this.mergeDirectedEdge\n : undirected\n ? this.addUndirectedEdge\n : this.addDirectedEdge;\n\n method.call(this, source, target, attributes);\n }\n }\n }\n\n return this;\n }\n\n /**---------------------------------------------------------------------------\n * Utils\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method returning a null copy of the graph, i.e. a graph without nodes\n * & edges but with the exact same options.\n *\n * @param {object} options - Options to merge with the current ones.\n * @return {Graph} - The null copy.\n */\n nullCopy(options) {\n const graph = new Graph(assign({}, this._options, options));\n graph.replaceAttributes(assign({}, this.getAttributes()));\n return graph;\n }\n\n /**\n * Method returning an empty copy of the graph, i.e. a graph without edges but\n * with the exact same options.\n *\n * @param {object} options - Options to merge with the current ones.\n * @return {Graph} - The empty copy.\n */\n emptyCopy(options) {\n const graph = this.nullCopy(options);\n\n this._nodes.forEach((nodeData, key) => {\n const attributes = assign({}, nodeData.attributes);\n\n // NOTE: no need to emit events since user cannot access the instance yet\n nodeData = new graph.NodeDataClass(key, attributes);\n graph._nodes.set(key, nodeData);\n });\n\n return graph;\n }\n\n /**\n * Method returning an exact copy of the graph.\n *\n * @param {object} options - Upgrade options.\n * @return {Graph} - The copy.\n */\n copy(options) {\n options = options || {};\n\n if (\n typeof options.type === 'string' &&\n options.type !== this.type &&\n options.type !== 'mixed'\n )\n throw new UsageGraphError(\n `Graph.copy: cannot create an incompatible copy from \"${this.type}\" type to \"${options.type}\" because this would mean losing information about the current graph.`\n );\n\n if (\n typeof options.multi === 'boolean' &&\n options.multi !== this.multi &&\n options.multi !== true\n )\n throw new UsageGraphError(\n 'Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.'\n );\n\n if (\n typeof options.allowSelfLoops === 'boolean' &&\n options.allowSelfLoops !== this.allowSelfLoops &&\n options.allowSelfLoops !== true\n )\n throw new UsageGraphError(\n 'Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.'\n );\n\n const graph = this.emptyCopy(options);\n\n const iterator = this._edges.values();\n\n let step, edgeData;\n\n while (((step = iterator.next()), step.done !== true)) {\n edgeData = step.value;\n\n // NOTE: no need to emit events since user cannot access the instance yet\n addEdge(\n graph,\n 'copy',\n false,\n edgeData.undirected,\n edgeData.key,\n edgeData.source.key,\n edgeData.target.key,\n assign({}, edgeData.attributes)\n );\n }\n\n return graph;\n }\n\n /**---------------------------------------------------------------------------\n * Known methods\n **---------------------------------------------------------------------------\n */\n\n /**\n * Method used by JavaScript to perform JSON serialization.\n *\n * @return {object} - The serialized graph.\n */\n toJSON() {\n return this.export();\n }\n\n /**\n * Method returning [object Graph].\n */\n toString() {\n return '[object Graph]';\n }\n\n /**\n * Method used internally by node's console to display a custom object.\n *\n * @return {object} - Formatted object representation of the graph.\n */\n inspect() {\n const nodes = {};\n this._nodes.forEach((data, key) => {\n nodes[key] = data.attributes;\n });\n\n const edges = {},\n multiIndex = {};\n\n this._edges.forEach((data, key) => {\n const direction = data.undirected ? '--' : '->';\n\n let label = '';\n\n let source = data.source.key;\n let target = data.target.key;\n let tmp;\n\n if (data.undirected && source > target) {\n tmp = source;\n source = target;\n target = tmp;\n }\n\n const desc = `(${source})${direction}(${target})`;\n\n if (!key.startsWith('geid_')) {\n label += `[${key}]: `;\n } else if (this.multi) {\n if (typeof multiIndex[desc] === 'undefined') {\n multiIndex[desc] = 0;\n } else {\n multiIndex[desc]++;\n }\n\n label += `${multiIndex[desc]}. `;\n }\n\n label += desc;\n\n edges[label] = data.attributes;\n });\n\n const dummy = {};\n\n for (const k in this) {\n if (\n this.hasOwnProperty(k) &&\n !EMITTER_PROPS.has(k) &&\n typeof this[k] !== 'function' &&\n typeof k !== 'symbol'\n )\n dummy[k] = this[k];\n }\n\n dummy.attributes = this._attributes;\n dummy.nodes = nodes;\n dummy.edges = edges;\n\n privateProperty(dummy, 'constructor', this.constructor);\n\n return dummy;\n }\n}\n\n/**\n * Attaching methods to the prototype.\n *\n * Here, we are attaching a wide variety of methods to the Graph class'\n * prototype when those are very numerous and when their creation is\n * abstracted.\n */\n\n/**\n * Attaching custom inspect method for node >= 10.\n */\nif (typeof Symbol !== 'undefined')\n Graph.prototype[Symbol.for('nodejs.util.inspect.custom')] =\n Graph.prototype.inspect;\n\n/**\n * Related to edge addition.\n */\nEDGE_ADD_METHODS.forEach(method => {\n ['add', 'merge', 'update'].forEach(verb => {\n const name = method.name(verb);\n const fn = verb === 'add' ? addEdge : mergeEdge;\n\n if (method.generateKey) {\n Graph.prototype[name] = function (source, target, attributes) {\n return fn(\n this,\n name,\n true,\n (method.type || this.type) === 'undirected',\n null,\n source,\n target,\n attributes,\n verb === 'update'\n );\n };\n } else {\n Graph.prototype[name] = function (edge, source, target, attributes) {\n return fn(\n this,\n name,\n false,\n (method.type || this.type) === 'undirected',\n edge,\n source,\n target,\n attributes,\n verb === 'update'\n );\n };\n }\n });\n});\n\n/**\n * Attributes-related.\n */\nattachNodeAttributesMethods(Graph);\nattachEdgeAttributesMethods(Graph);\n\n/**\n * Edge iteration-related.\n */\nattachEdgeIterationMethods(Graph);\n\n/**\n * Neighbor iteration-related.\n */\nattachNeighborIterationMethods(Graph);\n","/**\n * Graphology Helper Classes\n * ==========================\n *\n * Building some higher-order classes instantiating the graph with\n * predefinite options.\n */\nimport {assign} from './utils';\nimport Graph from './graph';\n\nimport {\n InvalidArgumentsGraphError,\n NotFoundGraphError,\n UsageGraphError\n} from './errors';\n\n/**\n * Alternative constructors.\n */\nclass DirectedGraph extends Graph {\n constructor(options) {\n const finalOptions = assign({type: 'directed'}, options);\n\n if ('multi' in finalOptions && finalOptions.multi !== false)\n throw new InvalidArgumentsGraphError(\n 'DirectedGraph.from: inconsistent indication that the graph should be multi in given options!'\n );\n\n if (finalOptions.type !== 'directed')\n throw new InvalidArgumentsGraphError(\n 'DirectedGraph.from: inconsistent \"' +\n finalOptions.type +\n '\" type in given options!'\n );\n\n super(finalOptions);\n }\n}\nclass UndirectedGraph extends Graph {\n constructor(options) {\n const finalOptions = assign({type: 'undirected'}, options);\n\n if ('multi' in finalOptions && finalOptions.multi !== false)\n throw new InvalidArgumentsGraphError(\n 'UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!'\n );\n\n if (finalOptions.type !== 'undirected')\n throw new InvalidArgumentsGraphError(\n 'UndirectedGraph.from: inconsistent \"' +\n finalOptions.type +\n '\" type in given options!'\n );\n\n super(finalOptions);\n }\n}\nclass MultiGraph extends Graph {\n constructor(options) {\n const finalOptions = assign({multi: true}, options);\n\n if ('multi' in finalOptions && finalOptions.multi !== true)\n throw new InvalidArgumentsGraphError(\n 'MultiGraph.from: inconsistent indication that the graph should be simple in given options!'\n );\n\n super(finalOptions);\n }\n}\nclass MultiDirectedGraph extends Graph {\n constructor(options) {\n const finalOptions = assign({type: 'directed', multi: true}, options);\n\n if ('multi' in finalOptions && finalOptions.multi !== true)\n throw new InvalidArgumentsGraphError(\n 'MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!'\n );\n\n if (finalOptions.type !== 'directed')\n throw new InvalidArgumentsGraphError(\n 'MultiDirectedGraph.from: inconsistent \"' +\n finalOptions.type +\n '\" type in given options!'\n );\n\n super(finalOptions);\n }\n}\nclass MultiUndirectedGraph extends Graph {\n constructor(options) {\n const finalOptions = assign({type: 'undirected', multi: true}, options);\n\n if ('multi' in finalOptions && finalOptions.multi !== true)\n throw new InvalidArgumentsGraphError(\n 'MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!'\n );\n\n if (finalOptions.type !== 'undirected')\n throw new InvalidArgumentsGraphError(\n 'MultiUndirectedGraph.from: inconsistent \"' +\n finalOptions.type +\n '\" type in given options!'\n );\n\n super(finalOptions);\n }\n}\n\n/**\n * Attaching static #.from method to each of the constructors.\n */\nfunction attachStaticFromMethod(Class) {\n /**\n * Builds a graph from serialized data or another graph's data.\n *\n * @param {Graph|SerializedGraph} data - Hydratation data.\n * @param {object} [options] - Options.\n * @return {Class}\n */\n Class.from = function (data, options) {\n // Merging given options with serialized ones\n const finalOptions = assign({}, data.options, options);\n\n const instance = new Class(finalOptions);\n instance.import(data);\n\n return instance;\n };\n}\n\nattachStaticFromMethod(Graph);\nattachStaticFromMethod(DirectedGraph);\nattachStaticFromMethod(UndirectedGraph);\nattachStaticFromMethod(MultiGraph);\nattachStaticFromMethod(MultiDirectedGraph);\nattachStaticFromMethod(MultiUndirectedGraph);\n\nGraph.Graph = Graph;\nGraph.DirectedGraph = DirectedGraph;\nGraph.UndirectedGraph = UndirectedGraph;\nGraph.MultiGraph = MultiGraph;\nGraph.MultiDirectedGraph = MultiDirectedGraph;\nGraph.MultiUndirectedGraph = MultiUndirectedGraph;\n\nGraph.InvalidArgumentsGraphError = InvalidArgumentsGraphError;\nGraph.NotFoundGraphError = NotFoundGraphError;\nGraph.UsageGraphError = UsageGraphError;\n\nexport {\n Graph,\n DirectedGraph,\n UndirectedGraph,\n MultiGraph,\n MultiDirectedGraph,\n MultiUndirectedGraph\n};\n","/**\n * Graphology ESM Endoint\n * =======================\n *\n * Endpoint for ESM modules consumers.\n */\nimport {\n Graph,\n DirectedGraph,\n UndirectedGraph,\n MultiGraph,\n MultiDirectedGraph,\n MultiUndirectedGraph\n} from './classes';\n\nimport {\n InvalidArgumentsGraphError,\n NotFoundGraphError,\n UsageGraphError\n} from './errors';\n\nexport default Graph;\n\nexport {\n Graph,\n DirectedGraph,\n UndirectedGraph,\n MultiGraph,\n MultiDirectedGraph,\n MultiUndirectedGraph,\n InvalidArgumentsGraphError,\n NotFoundGraphError,\n UsageGraphError\n};\n"],"names":[],"mappings":"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"}