Mirror 'root' functionality for leaf nodes dev
authorHraban Luyat <hraban@0brg.net>
Fri, 27 May 2011 15:57:57 +0000 (15:57 +0000)
committerOlof-Joachim Frahm <olof@macrolet.net>
Fri, 6 Sep 2013 17:53:11 +0000 (19:53 +0200)
Defines two new functions: graph-leafs and leafp. These are similar to
graph-roots and rootp but act on leaf nodes instead.

dev/api.lisp
dev/graph.lisp
dev/package.lisp

index 332b881..955f5dd 100644 (file)
@@ -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
index 6df7ec3..1f50e3a 100644 (file)
@@ -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 <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)
index 83e707f..5181ee1 100644 (file)
@@ -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