From: Hraban Luyat Date: Fri, 27 May 2011 15:57:57 +0000 (+0000) Subject: Mirror 'root' functionality for leaf nodes X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=281f4da380b5659c7a4d21cfa1a682d31a2ecb19;p=cl-graph.git Mirror 'root' functionality for leaf nodes Defines two new functions: graph-leafs and leafp. These are similar to graph-roots and rootp but act on leaf nodes instead. --- diff --git a/dev/api.lisp b/dev/api.lisp index 332b881..955f5dd 100644 --- a/dev/api.lisp +++ b/dev/api.lisp @@ -550,11 +550,22 @@ as a source. [?? Could be a defun].")) are out-going\). (cf. rootp) [?? could be a defun]")) +(defgeneric graph-leafs (graph) + (:documentation "Returns a list of the leafs of graph. A leaf is + defined as a vertex with no target edges \(i.e., all of the edges + are incoming\). (cf. targetp) [?? could be a defun]")) + + (defgeneric rootp (vertex) (:documentation "Returns true if `vertex` is a root vertex \(i.e., it has no incoming \(source\) edges\).")) +(defgeneric leafp (vertex) + (:documentation "Returns true if `vertex` is a leaf vertex \(i.e., + it has no outgoing \(target\) edges\).")) + + (defgeneric find-vertex-if (thing predicate &key key) (:documentation "Returns the first vertex in `thing` for which the `predicate` function returns non-nil. If the `key` is supplied, then diff --git a/dev/graph.lisp b/dev/graph.lisp index 6df7ec3..1f50e3a 100644 --- a/dev/graph.lisp +++ b/dev/graph.lisp @@ -644,11 +644,19 @@ something is putting something on the vertexes plist's (collect-elements (graph-vertexes graph) :filter #'rootp)) +(defmethod graph-leafs ((graph basic-graph)) + (collect-elements (graph-vertexes graph) :filter #'leafp)) + + (defmethod rootp ((vertex basic-vertex)) ;;?? this is inefficient in the same way that (zerop (length )) is... (zerop (target-edge-count vertex))) +(defmethod leafp ((vertex basic-vertex)) + (zerop (source-edge-count vertex))) + + (defmethod find-vertex-if ((graph basic-graph) fn &key key) (iterate-vertexes graph (lambda (v) diff --git a/dev/package.lisp b/dev/package.lisp index 83e707f..5181ee1 100644 --- a/dev/package.lisp +++ b/dev/package.lisp @@ -46,7 +46,9 @@ DISCUSSION #:target-edge-count ; vertex #:rootp ; vertex + #:leafp ; vertex #:graph-roots ; graph + #:graph-leafs ; graph #:topological-sort ; graph #:depth ; graph | vertex