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:
parent
9a6beb3b7f
commit
623e4df42a
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue