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;