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
(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 <list>)) 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)