In computer science, a graph is an abstract data type that is meant to implement the undirected graph and directed graph concepts from mathematics, specifically the field of graph theory
A graph data structure consists of a finite (and possibly mutable) set of vertices or nodes or points, together with a set of unordered pairs of these vertices for an undirected graph or a set of ordered pairs for a directed graph. These pairs are known as edges, arcs, or lines for an undirected graph and as arrows, directed edges, directed arcs, or directed lines for a directed graph. The vertices may be part of the graph structure, or may be external entities represented by integer indices or references.
Text and source code from https://github.com/trekhleb/javascript-algorithms/tree/master/src/data-structures/graph
There were no relationships to reverse engineer so I added them manually with
Graph "*" *--> GraphVertex : vertices
Graph "*" *--> GraphEdge : edges
GraphVertex "*" *--> GraphEdge : edges
markup.
I've added a couple of literate code map "method" compartments containing code fragments and a little bit of commentary.
The PlantUML markup is
class Graph {
method("constructor", "isDirected = false")
The constructor looks like this:
```
this.vertices = {};
this.edges = {};
this.isDirected = isDirected;
```
This class doesn't actually create instances
of any other class - any such wiring is done
by callers of this classes e.g. via addEdge etc. xref("1", "source")
method("addEdge", "edge")
xref("1")
This method doesn't just add edges to <b>this.edges</b>
```
// Check if edge has been already added.
if (this.edges[edge.getKey()]) {
throw new Error('Edge has already been added before');
} else {
this.edges[edge.getKey()] = edge;
}
```
it also adds information to <b>this.vertices</b>
```
// Try to find and end start vertices.
let startVertex = this.getVertexByKey(edge.startVertex.getKey());
let endVertex = this.getVertexByKey(edge.endVertex.getKey());
// Insert start vertex if it wasn't inserted.
if (!startVertex) {
this.addVertex(edge.startVertex);
startVertex = this.getVertexByKey(edge.startVertex.getKey());
}
```
}
Additional analysis could easily be done to add even more information to this diagram. This is just a beginning.
List of repository modules/files being visualised in the above diagram:
src/data-structures/graph/Graph.js
src/data-structures/graph/GraphEdge.js
src/data-structures/graph/GraphVertex.js