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))));
 }