1 | import * as util from '../util';
|
2 |
|
3 | let elesfn = {};
|
4 |
|
5 | function 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 |
|
37 | util.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 |
|
63 | function 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 |
|
80 | util.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 |
|
106 | util.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 |
|
119 | export default elesfn;
|