# js-graph-spec

Graph specification code bricks for JavaScript. Parent is js-gn.

`graphspec.Graph( "My graph implementation" , MyGraphConstructor ) ;`

Can be managed through jspm, duo, component, bower, ender, jam, spm, and npm.

## Install

### jspm

```
jspm install github:aureooms/js-graph-spec
# or
jspm install npm:@aureooms/js-graph-spec
```

### duo

No install step needed for duo!

### component

```
component install aureooms/js-graph-spec
```

### bower

```
bower install @aureooms/js-graph-spec
```

### ender

```
ender add @aureooms/js-graph-spec
```

### jam

```
jam install @aureooms/js-graph-spec
```

### spm

```
spm install @aureooms/js-graph-spec --save
```

### npm

```
npm install @aureooms/js-graph-spec --save
```

## Require

### jspm

```
let graphspec = require( "github:aureooms/js-graph-spec" ) ;
// or
import graphspec from '@aureooms/js-graph-spec' ;
```

### duo

`let graphspec = require( "aureooms/js-graph-spec" ) ;`

### component, ender, spm, npm

`let graphspec = require( "@aureooms/js-graph-spec" ) ;`

### bower

The script tag exposes the global variable `graphspec`

.

`<script src="bower_components/@aureooms/js-graph-spec/js/dist/graph-spec.min.js"></script>`

Alternatively, you can use any tool mentioned here.

### jam

`require( [ "@aureooms/js-graph-spec" ] , function ( graphspec ) { ... } ) ;`

## Signatures

### Graphs, DiGraphs, MultiGraphs, and MultiDiGraphs

####
`Graph`

, `DiGraph`

, `MultiGraph`

, or `MultiDiGraph`

Create a new graph.

```
let G = new Graph( ) ;
// ...
let G = new DiGraph( ) ;
// ...
let G = new MultiGraph( ) ;
// ...
let G = new MultiDiGraph( ) ;
// ...
```

####
`vadd`

Add a vertex to graph `G`

.

`let u = G.vadd( ) ;`

####
`vdel`

Delete vertex `u`

from graph `G`

.

`G.vdel( u ) ;`

####
`eadd`

Add edge `(u,v)`

to graph `G`

.

`let e = G.eadd( u , v ) ;`

####
`edel`

Delete edge `e`

from graph `G`

.

`G.edel( e ) ;`

####
`vitr`

Get an iterator over vertex references in graph `G`

.

`for ( let u of G.vitr( ) ) ... ;`

####
`eitr`

Get an iterator over edge references in graph `G`

.

`for ( let e of g.eitr( ) ) ... ;`

####
`iitr`

Get an iterator over edge references of edges incident to `u`

in graph `G`

.

`for ( let e of G.iitr( u ) ) ... ;`

####
`nitr`

Get an iterator over vertex references of neighbors of `u`

in graph `G`

.

`for ( let v of G.nitr( u ) ) ... ;`

####
`vertices`

Get an iterator over vertices in graph `G`

.

`for ( let u of G.vertices( ) ) ... ;`

####
`edges`

Get an iterator over edges in graph `G`

.

`for ( let [ u , v , e ] of G.edges( ) ) ... ;`

####
`incident`

Get an iterator over edges incident to `w`

in graph `G`

.

`for ( let [ u , v , e ] of G.incident( w ) ) ... ;`

####
`endpoints`

Get endpoints `u`

and `v`

of an edge reference `e`

in graph `G`

.

`let [ u , v ] = G.endpoints( e ) ;`

### DiGraphs and MultiDiGraphs

These methods must also be implemented (with the same invariants) in Graphs and MultiGraphs for convenience.

####
`initr`

Get an iterator over edge references of ingoing edges of `u`

in graph `G`

.

`for ( let e of G.initr( u ) ) ... ;`

####
`outitr`

Get an iterator over edge references of outgoing edges of `u`

in graph `G`

.

`for ( let e of G.outitr( u ) ) ... ;`

####
`dpitr`

Get an iterator over direct predecessors of `u`

in graph `G`

.

`for ( let v of G.dpitr( u ) ) ... ;`

####
`dsitr`

Get an iterator over direct successors of `u`

in graph `G`

.

`for ( let v of G.dsitr( u ) ) ... ;`

####
`ingoing`

Get an iterator over ingoing edges of `w`

in graph `G`

.
The invariant `v === w`

must hold.

`for ( let [ u , v , e ] of G.ingoing( w ) ) ... ;`

####
`outgoing`

Get an iterator over outgoing edges of `w`

in graph `G`

.
The invariant `u === w`

must hold.

`for ( let [ u , v , e ] of G.outgoing( w ) ) ... ;`

####
`reverse`

Reverse the directions of edges in `G`

.

`G.reverse( ) ;`