protected virtual void RevoveEdgesOfChanged(WalkerWorker1 <TItem, TEdge> worker) { foreach (var edge in worker.Affected.OfType <TEdge>().ToArray()) { if (worker.Changed(edge.Root) || worker.Changed(edge.Leaf)) { worker.Remove(edge); } } }
/// <summary> /// add all items of worker into SubGraph /// add invisible, but valid edges into SubGraph: /// </summary> /// <param name="worker"></param> protected virtual void CommitAdd(WalkerWorker1 <TItem, TEdge> worker) { var changeStack = new Queue <TItem> (worker.Affected); while (changeStack.Count > 0) { var item = changeStack.Dequeue(); Sink.Add(item); // look if we have invisible, but valid edges var sink = Source as ISinkGraph <TItem, TEdge>; if (sink != null) { foreach (var edge in sink.ComplementEdges(item, Sink)) { if (!worker.Changed(edge)) { changeStack.Enqueue(edge); worker.AddChange(edge); } } } else { foreach (var edge in Source.Fork(item)) { if (worker.Contains(edge.Root) && worker.Contains(edge.Leaf)) { if (!worker.Changed(edge)) { changeStack.Enqueue(edge); worker.AddChange(edge); } } } } } }