private void RemoveTrigger()

in libraries/AdaptiveExpressions/TriggerTrees/Node.cs [490:593]


        private void RemoveTrigger(Trigger trigger, HashSet<Node> visited, ref bool removed)
        {
            if (!visited.Contains(this))
            {
                visited.Add(this);

                // Remove from allTriggers and triggers
                if (_allTriggers.Remove(trigger))
                {
                    // We found the trigger somewhere in the tree
                    removed = true;
#if TraceTree
                    if (Node.ShowTrace)
                    {
                        Debug.WriteLine("");
#if Count
                        Debug.Write($"{_count}:");
#endif
                        Debug.WriteLine(this);
                        Debug.WriteLine($"Removed from all triggers");
                    }
#endif
#if Count
                    ++_count;
#endif
                    if (_triggers.Remove(trigger))
                    {
#if TraceTree
                        if (Node.ShowTrace) Debug.WriteLine("Removed from triggers");
#endif
                        foreach (var candidate in _allTriggers)
                        {
                            var add = true;
                            foreach (var existing in _triggers)
                            {
                                var reln = candidate.Relationship(existing, Tree.Comparers);
                                if (reln == RelationshipType.Equal || reln == RelationshipType.Generalizes)
                                {
                                    add = false;
                                    break;
                                }
                            }

                            if (add)
                            {
#if TraceTree
                                if (Node.ShowTrace) Debug.WriteLine($"Moved {candidate} to triggers");
#endif
                                _triggers.Add(candidate);
                            }
                        }
                    }
                }

                // Remove from any children
                List<Node> emptyChildren = null;
                foreach (var child in _specializations)
                {
                    child.RemoveTrigger(trigger, visited, ref removed);
                    if (child.Triggers.Count == 0)
                    {
                        if (emptyChildren == null)
                        {
                            emptyChildren = new List<Node>();
                        }

                        emptyChildren.Add(child);
                    }
                }

                if (emptyChildren != null)
                {
                    // Remove children if no triggers left
                    foreach (var child in emptyChildren)
                    {
#if TraceTree
                        if (Node.ShowTrace) Debug.WriteLine($"Move children of {child} to {this}");
#endif
                        _specializations.Remove(child);
                        foreach (var specialization in child.Specializations)
                        {
                            var add = true;
                            foreach (var parent in _specializations)
                            {
                                var reln = parent.Relationship(specialization);
                                if (reln == RelationshipType.Generalizes)
                                {
                                    add = false;
                                    break;
                                }
                            }

                            if (add)
                            {
#if TraceTree
                                if (Node.ShowTrace) Debug.WriteLine($"Move {specialization}");
#endif
                                _specializations.Add(specialization);
                            }
                        }
                    }
                }
            }
        }