public TopologicalNode GetNode(object obj) { TopologicalNode node = (TopologicalNode) graph[obj]; if (node == null) node = new TopologicalNode(obj); graph[obj] = node; return node; }
static IEnumerable <TopologicalNode <ContributorNotification> > GetCompatibleNodes( IEnumerable <TopologicalNode <ContributorNotification> > nodes, TopologicalNode <ContributorNotification> notificationNode, Type type) { return(from compatibleNode in nodes where !compatibleNode.Equals(notificationNode) && type.IsInstanceOfType(compatibleNode.Item.Contributor) select compatibleNode); }
static IEnumerable<TopologicalNode<ContributorNotification>> GetCompatibleNodes( IEnumerable<TopologicalNode<ContributorNotification>> nodes, TopologicalNode<ContributorNotification> notificationNode, Type type) { return from compatibleNode in nodes where !compatibleNode.Equals(notificationNode) && type.IsInstanceOfType(compatibleNode.Item.Contributor) select compatibleNode; }
IEnumerable <TopologicalNode <ContributorInvocation> > Visit( Func <TopologicalNode <ContributorInvocation>, bool> selector, TopologicalNode <ContributorInvocation> currentNode, Func <TopologicalNode <ContributorInvocation>, IEnumerable <TopologicalNode <ContributorInvocation> > > nextSelector) { _visited = new Dictionary <TopologicalNode <ContributorInvocation>, bool>(); _selectedNodes = new List <TopologicalNode <ContributorInvocation> >(); _isSelected = selector ?? (node => true); if (currentNode != null) { VisitNode(currentNode, nextSelector); } else { VisitNodes(_nodes, nextSelector); } return(_selectedNodes); }
void VisitNode(TopologicalNode <ContributorInvocation> currentNode, Func <TopologicalNode <ContributorInvocation>, IEnumerable <TopologicalNode <ContributorInvocation> > > nextSelector) { if (_visited.TryGetValue(currentNode, out bool inProcess)) { if (inProcess) { throw new RecursionException($"Node contains a circular dependency: {currentNode}"); } return; } _visited[currentNode] = true; VisitNodes(nextSelector(currentNode).Where(n => !n.Equals(currentNode)).ToList(), nextSelector); _visited[currentNode] = false; if (_isSelected(currentNode)) { _selectedNodes.Add(currentNode); } }
static ContributorCall ToContributorCall(TopologicalNode <ContributorInvocation> node) { return(new ContributorCall(node.Item.Owner, node.Item.Target, node.Item.Description)); }
public IEnumerable <TopologicalNode <ContributorInvocation> > SelectAscending( Func <TopologicalNode <ContributorInvocation>, bool> selector = null, TopologicalNode <ContributorInvocation> currentNode = null) { return(Visit(selector, currentNode, node => node.DependsOn)); }
public IEnumerable <TopologicalNode <ContributorInvocation> > SelectDescending( Func <TopologicalNode <ContributorInvocation>, bool> selector = null, TopologicalNode <ContributorInvocation> currentNode = null) { return(Visit(selector, currentNode, node => _nodes.Where(n => n.DependsOn.Contains(node)))); }