graph: Expose 'traverse/depth-first'.

* guix/graph.scm (traverse/depth-first): New procedure, based on code
formerly in 'node-transitive-edges'.
(node-transitive-edges): Rewrite in terms of it.
This commit is contained in:
Ludovic Courtès 2016-05-23 22:31:59 +02:00
parent 9a6beb3b7f
commit 623e4df42a
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 15 additions and 7 deletions

View File

@ -37,6 +37,7 @@
node-edges node-edges
node-back-edges node-back-edges
traverse/depth-first
node-transitive-edges node-transitive-edges
%graphviz-backend %graphviz-backend
@ -99,13 +100,13 @@ returns its back edges. NODES is taken to be the sinks of the global graph."
(lambda (source target edges) (lambda (source target edges)
(vhash-consq target source edges)))) (vhash-consq target source edges))))
(define (node-transitive-edges nodes node-edges) (define (traverse/depth-first proc seed nodes node-edges)
"Return the list of nodes directly or indirectly connected to NODES "Do a depth-first traversal of NODES along NODE-EDGES, calling PROC with
according to the NODE-EDGES procedure. NODE-EDGES must be a one-argument each node and the current result, and visiting each reachable node exactly
procedure that, given a node, returns its list of direct dependents; it is once. NODES must be a list of nodes, and NODE-EDGES must be a one-argument
typically returned by 'node-edges' or 'node-back-edges'." procedure as returned by 'node-edges' or 'node-back-edges'."
(let loop ((nodes (append-map node-edges nodes)) (let loop ((nodes (append-map node-edges nodes))
(result '()) (result seed)
(visited (setq))) (visited (setq)))
(match nodes (match nodes
(() (()
@ -115,9 +116,16 @@ typically returned by 'node-edges' or 'node-back-edges'."
(loop tail result visited) (loop tail result visited)
(let ((edges (node-edges head))) (let ((edges (node-edges head)))
(loop (append edges tail) (loop (append edges tail)
(cons head result) (proc head result)
(set-insert head visited)))))))) (set-insert head visited))))))))
(define (node-transitive-edges nodes node-edges)
"Return the list of nodes directly or indirectly connected to NODES
according to the NODE-EDGES procedure. NODE-EDGES must be a one-argument
procedure that, given a node, returns its list of direct dependents; it is
typically returned by 'node-edges' or 'node-back-edges'."
(traverse/depth-first cons '() nodes node-edges))
;;; ;;;
;;; Graphviz export. ;;; Graphviz export.