diff --git a/dev/api.lisp b/dev/api.lisp index 32231b3..6c31235 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-leaves (graph) + (:documentation "Returns a list of the leaves 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 8114715..b27daa6 100644 --- a/dev/graph.lisp +++ b/dev/graph.lisp @@ -677,11 +677,19 @@ something is putting something on the vertexes plist's (collect-elements (graph-vertexes graph) :filter #'rootp)) +(defmethod graph-leaves ((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..429d3f0 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-leaves ; graph #:topological-sort ; graph #:depth ; graph | vertex