UNPKG

3.18 kBJavaScriptView Raw
1
2//
3// IperGraph
4// =========
5//
6
7var _ = require('underscore')
8 , util = require('util')
9
10var IperEdge = require('./IperEdge')
11 , IperElement = require('./IperElement')
12 , IperNode = require('./IperNode')
13
14// Constructor
15
16function IperGraph(data) {
17
18 IperElement.call(this)
19
20 this.edges = {}
21 this.nodes = {}
22
23 // data
24 function getData() {
25 var data = {nodes:{}, edges:{}}
26
27 for (var i in this.nodes) {
28 var node = this.nodes[i]
29 data.nodes[node.id] = node.data
30 }
31
32 for (var i in this.edges) {
33 var edge = this.edges[i]
34 data.edges[edge.id] = edge.nodeIds
35 }
36
37 return data
38 }
39
40 Object.defineProperty(this, 'data', {get: getData})
41
42 // try to load data passed to constructor
43 try {
44 load(data)
45 }
46 catch (ignore) {}
47}
48
49util.inherits(IperGraph, IperNode)
50
51function check(data) {
52 // data.edges has existing nodeIds
53 for (var edgeId in data.edges) {
54 var edgeData = data.edges[edgeId]
55 for (var i in edgeData) {
56 var nodeId = edgeData[i]
57 if (typeof data.nodes[nodeId] === 'undefined')
58 throw new Error()
59 }
60 }
61 return true
62}
63IperGraph.prototype.check = check
64
65function load(data) {
66 // check if data is valid
67 try {
68 check(data)
69 }
70 catch (er) { throw er }
71
72 // store a lookup of new <--> old ids
73 var nu = {}
74
75 // create new nodes
76 for (var id in data.nodes) {
77 nu[id] = this.createNode(data.nodes[id])
78 }
79
80 // create new edges
81 for (var id in data.edges) {
82 var nodeIds = []
83 var oldNodeIds = data.edges[id]
84
85 for (var i in oldNodeIds) {
86 nodeId = oldNodeIds[i]
87 nodeIds.push(nu[nodeId])
88 }
89
90 this.createEdge(nodeIds)
91 }
92}
93IperGraph.prototype.load = load
94
95function createEdge(nodeIds) {
96 var edge = new IperEdge(this, nodeIds)
97 this.edges[edge.id] = edge
98 return edge.id;
99}
100IperGraph.prototype.createEdge = createEdge
101
102function getEdge(id) {
103 var edge = this.edges[id]
104
105 if (_.isUndefined(edge))
106 throw new Error()
107
108 return edge
109}
110IperGraph.prototype.getEdge = getEdge
111
112function removeEdge(id) {
113 delete this.edges[id]
114}
115IperGraph.prototype.removeEdge = removeEdge
116
117function removeNode(id) {
118 // loop over all edges
119 for (var i in this.edges) {
120 var edge = this.edges[i]
121
122 // loop over edge nodeIds
123 for (var j in edge.nodeIds) {
124 var nodeId = edge.nodeIds[j]
125
126 // remove nodeId from edges linked to removed node
127 if (id === nodeId)
128 edge.nodeIds.splice(j, 1)
129 }
130
131 if (edge.nodeIds.lenght < 2)
132 edge.remove()
133 }
134
135 delete this.nodes[id]
136}
137IperGraph.prototype.removeNode = removeNode
138
139function createNode(data) {
140 var node = new IperNode(this, data)
141 this.nodes[node.id] = node
142 return node.id
143}
144IperGraph.prototype.createNode = createNode
145
146function getNode(id) {
147 var node = this.nodes[id]
148
149 if (_.isUndefined(node))
150 throw new Error()
151
152 return node
153}
154IperGraph.prototype.getNode = getNode
155
156function deleteNode(id) {
157 delete this.nodes[id]
158}
159IperGraph.prototype.deleteNode = deleteNode
160
161module.exports = IperGraph
162