/**
* @file Provides data structure for directed graphs
* @name Directed Graph
* @author Mr. Bean <[email protected]>
* @license MIT
* @copyright 2013 Mr. Bean
*/
/**
* A Graph object with the basic properties
*
* @namespace
*
* @property {object} vertices The vertices of the graph
* @property {array} edges The edges of the graph
* @property {number} length Length of the graph
*/
var Graph = function () {
/**
* Object for holding vertices of the Graph
*
*/
this.vertices = {};
/** Array of edges of the Graph */
this.edges = [];
/** Length of the Graph, initially set to 0 */
this.length = 0;
};
/**
* Constructor for a vertex of {@link Graph}
*
* @constructor
* @param {string} name Name of the vertex
* @param {number} value Value of the vertex
*
* @property {string} name The name given to the vertex
* @property {array} edges Edges of the vertex
* @property {number} value The value of the value argument
*/
Graph.Vertex = function (name, value) {
/** Store the name argument as a property **/
this.name = name;
/** Create an empty array for edges */
this.edges = [];
/** Store the value argument as a property */
this.value = value;
};
/**
* Prototype function which returns the number of edges of a {@link Graph.Vertex}
*
* @returns {number} The length of the edges
*/
Graph.Vertex.prototype.degree = function () {
return this.edges.length;
};
/**
* Constructor for edge of a {@link Graph}
*
* @constructor
* @param {Graph.Vertex} tail The tail vertex
* @param {Graph.Vertex} head The head vertex
*/
Graph.Edge = function (tail, head) {
this.tail = tail;
this.head = head;
tail.edges.push(this);
head.edges.push(this);
};
/**
* Add a new {@link Graph.Vertex} or updates the value of an existing one
*
* @example
* var newVertex = Graph.addVertex("vertex1", 20);
*
* @param {string} name Name of the new vertex
* @param {number} value Value of the new vertex
*
* @returns {Graph.Vertex} New or updated {@link Graph.Vertex}
*/
Graph.prototype.addVertex = function (name, value) {
if (!this.vertices[name]) {
this.vertices[name] = new Graph.Vertex(name, value);
this.length++;
}
else if (value) {
this.vertices[name].value = value;
}
return this.vertices[name];
};
/**
* Method for adding new {@link Graph.Edge}
*
* @returns {Graph.Edge} An instance of a {@link Graph.Edge}
*/
Graph.prototype.addEdge = function (tail, head) {
return new Graph.Edge(this.addVertex(tail), this.addVertex(head));
};
/**
* Exports the {@link Graph}
*
* @memberof member
*/
module.exports = Graph;