|
import * as util from '../util'; |
|
|
|
let elesfn = {}; |
|
|
|
function defineDegreeFunction( callback ){ |
|
return function( includeLoops ){ |
|
let self = this; |
|
|
|
if( includeLoops === undefined ){ |
|
includeLoops = true; |
|
} |
|
|
|
if( self.length === 0 ){ return; } |
|
|
|
if( self.isNode() && !self.removed() ){ |
|
let degree = 0; |
|
let node = self[0]; |
|
let connectedEdges = node._private.edges; |
|
|
|
for( let i = 0; i < connectedEdges.length; i++ ){ |
|
let edge = connectedEdges[ i ]; |
|
|
|
if( !includeLoops && edge.isLoop() ){ |
|
continue; |
|
} |
|
|
|
degree += callback( node, edge ); |
|
} |
|
|
|
return degree; |
|
} else { |
|
return; |
|
} |
|
}; |
|
} |
|
|
|
util.extend( elesfn, { |
|
degree: defineDegreeFunction( function( node, edge ){ |
|
if( edge.source().same( edge.target() ) ){ |
|
return 2; |
|
} else { |
|
return 1; |
|
} |
|
} ), |
|
|
|
indegree: defineDegreeFunction( function( node, edge ){ |
|
if( edge.target().same( node ) ){ |
|
return 1; |
|
} else { |
|
return 0; |
|
} |
|
} ), |
|
|
|
outdegree: defineDegreeFunction( function( node, edge ){ |
|
if( edge.source().same( node ) ){ |
|
return 1; |
|
} else { |
|
return 0; |
|
} |
|
} ) |
|
} ); |
|
|
|
function defineDegreeBoundsFunction( degreeFn, callback ){ |
|
return function( includeLoops ){ |
|
let ret; |
|
let nodes = this.nodes(); |
|
|
|
for( let i = 0; i < nodes.length; i++ ){ |
|
let ele = nodes[ i ]; |
|
let degree = ele[ degreeFn ]( includeLoops ); |
|
if( degree !== undefined && (ret === undefined || callback( degree, ret )) ){ |
|
ret = degree; |
|
} |
|
} |
|
|
|
return ret; |
|
}; |
|
} |
|
|
|
util.extend( elesfn, { |
|
minDegree: defineDegreeBoundsFunction( 'degree', function( degree, min ){ |
|
return degree < min; |
|
} ), |
|
|
|
maxDegree: defineDegreeBoundsFunction( 'degree', function( degree, max ){ |
|
return degree > max; |
|
} ), |
|
|
|
minIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, min ){ |
|
return degree < min; |
|
} ), |
|
|
|
maxIndegree: defineDegreeBoundsFunction( 'indegree', function( degree, max ){ |
|
return degree > max; |
|
} ), |
|
|
|
minOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, min ){ |
|
return degree < min; |
|
} ), |
|
|
|
maxOutdegree: defineDegreeBoundsFunction( 'outdegree', function( degree, max ){ |
|
return degree > max; |
|
} ) |
|
} ); |
|
|
|
util.extend( elesfn, { |
|
totalDegree: function( includeLoops ){ |
|
let total = 0; |
|
let nodes = this.nodes(); |
|
|
|
for( let i = 0; i < nodes.length; i++ ){ |
|
total += nodes[ i ].degree( includeLoops ); |
|
} |
|
|
|
return total; |
|
} |
|
} ); |
|
|
|
export default elesfn; |
|
|