UNPKG

2.57 kBJavaScriptView Raw
1import * as util from '../util';
2
3let elesfn = {};
4
5function defineDegreeFunction( callback ){
6 return function( includeLoops ){
7 let self = this;
8
9 if( includeLoops === undefined ){
10 includeLoops = true;
11 }
12
13 if( self.length === 0 ){ return; }
14
15 if( self.isNode() && !self.removed() ){
16 let degree = 0;
17 let node = self[0];
18 let connectedEdges = node._private.edges;
19
20 for( let i = 0; i < connectedEdges.length; i++ ){
21 let edge = connectedEdges[ i ];
22
23 if( !includeLoops && edge.isLoop() ){
24 continue;
25 }
26
27 degree += callback( node, edge );
28 }
29
30 return degree;
31 } else {
32 return;
33 }
34 };
35}
36
37util.extend( elesfn, {
38 degree: defineDegreeFunction( function( node, edge ){
39 if( edge.source().same( edge.target() ) ){
40 return 2;
41 } else {
42 return 1;
43 }
44 } ),
45
46 indegree: defineDegreeFunction( function( node, edge ){
47 if( edge.target().same( node ) ){
48 return 1;
49 } else {
50 return 0;
51 }
52 } ),
53
54 outdegree: defineDegreeFunction( function( node, edge ){
55 if( edge.source().same( node ) ){
56 return 1;
57 } else {
58 return 0;
59 }
60 } )
61} );
62
63function defineDegreeBoundsFunction( degreeFn, callback ){
64 return function( includeLoops ){
65 let ret;
66 let nodes = this.nodes();
67
68 for( let i = 0; i < nodes.length; i++ ){
69 let ele = nodes[ i ];
70 let degree = ele[ degreeFn ]( includeLoops );
71 if( degree !== undefined && (ret === undefined || callback( degree, ret )) ){
72 ret = degree;
73 }
74 }
75
76 return ret;
77 };
78}
79
80util.extend( elesfn, {
81 minDegree: defineDegreeBoundsFunction( 'degree', function( degree, min ){
82 return degree < min;
83 } ),
84
85 maxDegree: defineDegreeBoundsFunction( 'degree', function( degree, max ){
86 return degree > max;
87 } ),
88
89 minIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, min ){
90 return degree < min;
91 } ),
92
93 maxIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, max ){
94 return degree > max;
95 } ),
96
97 minOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, min ){
98 return degree < min;
99 } ),
100
101 maxOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, max ){
102 return degree > max;
103 } )
104} );
105
106util.extend( elesfn, {
107 totalDegree: function( includeLoops ){
108 let total = 0;
109 let nodes = this.nodes();
110
111 for( let i = 0; i < nodes.length; i++ ){
112 total += nodes[ i ].degree( includeLoops );
113 }
114
115 return total;
116 }
117} );
118
119export default elesfn;