graph-builder
Version:
A graph builder library for modeling abstract graph structures.
183 lines (142 loc) • 4.94 kB
Markdown
# Graph Builder
A graph builder library for modeling, and traversing abstract graph structures.
This is a (incomplete) port of the [guava graph library](https://github.com/google/guava/wiki/GraphsExplained).
The main entry point for building the graph are the
[`GraphBuilder`](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.graphbuilder.md)
for building a
[`MutableGraph`](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.mutablegraph.md) and
[`ValueGraphBuilder`](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.valuegraphbuilder.md)
for building a
[`MutableValueGraph`](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.mutablevaluegraph.md).
## Graph Traversal
There is also a [traverser](https://github.com/sorohan/graph-builder/blob/traverers/markdown/graph-builder.traversers.md)
which can perform different types of traversal of any graphs/trees (that implement
[SuccessorFunction](https://github.com/sorohan/graph-builder/blob/traverers/markdown/graph-builder.successorsfunction.md),
which all the Graphs created by the
[GraphBuilder](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.graphbuilder.md) do).
## Examples
### Creating a Graph
Create an *undirected* [Mutablegraph](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.mutablegraph.md):
- Inherits from [Graph](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.graph.md)
- And [BaseGraph](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.basegraph.md)
```javascript
const { GraphBuilder } = require('graph-builder');
const graph = GraphBuilder.undirected().allowsSelfLoops(true).build();
```
Add some nodes:
```javascript
graph.addNode("bread");
```
Add some edges (silently adds nodes too):
```javascript
graph.putEdge("bread", "bread");
graph.putEdge("chocolate", "peanut butter");
graph.putEdge("peanut butter", "jelly");
```
Remove an edge:
```javascript
graph.removeEdge("chocolate", "peanut butter");
```
### Reading From the Graph
Everything returned is [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols).
Get connected nodes:
```javascript
for (const n of graph.adjacentNodes("peanut butter")) {
console.log(n);
}
// prints:
// chocolate
// jelly
```
Get all the edges:
```javascript
for (const e of graph.edges()) {
console.log(e.nodeU, ' => ', e.nodeV);
}
// prints:
// bread => bread
// peanut butter => chocolate
// jelly => peanut butter
```
Get all edges connected to "peanut butter":
```javascript
for (const e of graph.incidentEdges("peanut butter")) {
console.log(e.nodeU, ' => ', e.nodeV);
}
// prints:
// chocolate => peanut butter
// jelly => peanut butter
```
Get all the successors/predecessors of "peanut butter" (in an undirected graph, these are the same):
```javascript
for (const n of graph.successors("peanut butter")) {
console.log(n);
}
// prints:
// chocolate
// jelly
for (const n of graph.predecessors("peanut butter")) {
console.log(n);
}
// prints:
// chocolate
// jelly
```
Or for a *directed* graph:
```javascript
const graph = GraphBuilder.directed().allowsSelfLoops(true).build();
graph.putEdge("bread", "bread");
graph.putEdge("chocolate", "peanut butter");
graph.putEdge("peanut butter", "jelly");
for (const n of graph.successors("peanut butter")) {
console.log(n);
}
// prints:
// jelly
for (const n of graph.predecessors("peanut butter")) {
console.log(n);
}
// prints:
// chocolate
```
### Traversing the Graph
The traversers return iterators.
Traverse a graph that looks like this (numbered breadth first):
```
1 2
| \ |
3 4--5
|
6
```
```javascript
const { GraphBuilder, Traversers } = require('graph-builder');
const graph = GraphBuilder.directed().allowsSelfLoops(true).build();
graph.putEdge(1, 3);
graph.putEdge(1, 4);
graph.putEdge(2, 5);
graph.putEdge(4, 5);
graph.putEdge(3, 6);
```
Iterate breadth first:
```javascript
const nodeIterator = Traversers.forGraph(graph).breadthFirst(1, 2); // starting from root nodes, 1 & 2
console.log(Array.from(nodeIterator).join(', '));
// prints: 1, 2, 3, 4, 5, 6,
```
Iterate depth first preorder:
```javascript
const nodeIterator = Traversers.forGraph(graph).depthFirstPreOrder(1, 2); // starting from root nodes, 1 & 2
console.log(Array.from(nodeIterator).join(', '));
// prints: 1, 3, 6, 4, 5, 2
```
Iterate depth first postorder:
```javascript
const nodeIterator = Traversers.forGraph(graph).depthFirstPostOrder(1, 2); // starting from root nodes, 1 & 2
console.log(Array.from(nodeIterator).join(', '));
// prints: 6, 3, 5, 4, 1, 2
```
## More
See the full [API
documentation](https://github.com/sorohan/graph-builder/blob/master/markdown/graph-builder.md) for usage.
Full `typescript` typings are also provided.