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