dag: Replace

This commit is contained in:
Mitchell Hashimoto 2015-02-07 15:37:17 -08:00
parent 81856f99ba
commit af8d33ddb8
2 changed files with 49 additions and 0 deletions

View File

@ -73,6 +73,30 @@ func (g *Graph) Remove(v Vertex) Vertex {
return nil return nil
} }
// Replace replaces the original Vertex with replacement. If the original
// does not exist within the graph, then false is returned. Otherwise, true
// is returned.
func (g *Graph) Replace(original, replacement Vertex) bool {
// If we don't have the original, we can't do anything
if !g.vertices.Include(original) {
return false
}
// Add our new vertex, then copy all the edges
g.Add(replacement)
for _, target := range g.DownEdges(original).List() {
g.Connect(BasicEdge(replacement, target))
}
for _, source := range g.UpEdges(original).List() {
g.Connect(BasicEdge(source, replacement))
}
// Remove our old vertex, which will also remove all the edges
g.Remove(original)
return true
}
// RemoveEdge removes an edge from the graph. // RemoveEdge removes an edge from the graph.
func (g *Graph) RemoveEdge(edge Edge) { func (g *Graph) RemoveEdge(edge Edge) {
g.once.Do(g.init) g.once.Do(g.init)

View File

@ -47,12 +47,29 @@ func TestGraph_remove(t *testing.T) {
} }
} }
func TestGraph_replace(t *testing.T) {
var g Graph
g.Add(1)
g.Add(2)
g.Add(3)
g.Connect(BasicEdge(1, 2))
g.Connect(BasicEdge(2, 3))
g.Replace(2, 42)
actual := strings.TrimSpace(g.String())
expected := strings.TrimSpace(testGraphReplaceStr)
if actual != expected {
t.Fatalf("bad: %s", actual)
}
}
const testGraphBasicStr = ` const testGraphBasicStr = `
1 1
3 3
2 2
3 3
` `
const testGraphEmptyStr = ` const testGraphEmptyStr = `
1 1
2 2
@ -63,3 +80,11 @@ const testGraphRemoveStr = `
1 1
2 2
` `
const testGraphReplaceStr = `
1
42
3
42
3
`