|
|
|
|
@ -30,14 +30,21 @@ func (g *AcyclicGraph) DirectedGraph() Grapher {
|
|
|
|
|
|
|
|
|
|
// Returns a Set that includes every Vertex yielded by walking down from the
|
|
|
|
|
// provided starting Vertex v.
|
|
|
|
|
func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) {
|
|
|
|
|
func (g *AcyclicGraph) Ancestors(vs ...Vertex) (Set, error) {
|
|
|
|
|
s := make(Set)
|
|
|
|
|
memoFunc := func(v Vertex, d int) error {
|
|
|
|
|
s.Add(v)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := g.DepthFirstWalk(g.downEdgesNoCopy(v), memoFunc); err != nil {
|
|
|
|
|
start := make(Set)
|
|
|
|
|
for _, v := range vs {
|
|
|
|
|
for _, dep := range g.downEdgesNoCopy(v) {
|
|
|
|
|
start.Add(dep)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := g.DepthFirstWalk(start, memoFunc); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -46,14 +53,21 @@ func (g *AcyclicGraph) Ancestors(v Vertex) (Set, error) {
|
|
|
|
|
|
|
|
|
|
// Returns a Set that includes every Vertex yielded by walking up from the
|
|
|
|
|
// provided starting Vertex v.
|
|
|
|
|
func (g *AcyclicGraph) Descendents(v Vertex) (Set, error) {
|
|
|
|
|
func (g *AcyclicGraph) Descendents(vs ...Vertex) (Set, error) {
|
|
|
|
|
s := make(Set)
|
|
|
|
|
memoFunc := func(v Vertex, d int) error {
|
|
|
|
|
s.Add(v)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := g.ReverseDepthFirstWalk(g.upEdgesNoCopy(v), memoFunc); err != nil {
|
|
|
|
|
start := make(Set)
|
|
|
|
|
for _, v := range vs {
|
|
|
|
|
for _, dep := range g.upEdgesNoCopy(v) {
|
|
|
|
|
start.Add(dep)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := g.ReverseDepthFirstWalk(start, memoFunc); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|