changeset 70851:9119e54a8121

(ewoc-delete): New function. (ewoc-filter): Use `ewoc-delete'.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Tue, 23 May 2006 07:30:20 +0000
parents b90abedf3b79
children 426725b2ce9a
files lisp/emacs-lisp/ewoc.el
diffstat 1 files changed, 26 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/ewoc.el	Tue May 23 07:19:45 2006 +0000
+++ b/lisp/emacs-lisp/ewoc.el	Tue May 23 07:30:20 2006 +0000
@@ -107,6 +107,7 @@
 ;; (defun ewoc-nth (ewoc n)
 ;; (defun ewoc-map (map-function ewoc &rest args)
 ;; (defun ewoc-filter (ewoc predicate &rest args)
+;; (defun ewoc-delete (ewoc &rest nodes)
 ;; (defun ewoc-locate (ewoc &optional pos guess)
 ;; (defun ewoc-invalidate (ewoc &rest nodes)
 ;; (defun ewoc-goto-prev (ewoc arg)
@@ -376,6 +377,27 @@
             (ewoc--refresh-node pp node))
         (setq node (ewoc--node-next dll node))))))
 
+(defun ewoc-delete (ewoc &rest nodes)
+  "Delete NODES from EWOC."
+  (ewoc--set-buffer-bind-dll-let* ewoc
+      ((L nil) (R nil))
+    (dolist (node nodes)
+      ;; If we are about to delete the node pointed at by last-node,
+      ;; set last-node to nil.
+      (if (eq (ewoc--last-node ewoc) node)
+          (setf (ewoc--last-node ewoc) nil))
+      (delete-region (ewoc--node-start-marker node)
+                     (ewoc--node-start-marker (ewoc--node-next dll node)))
+      (set-marker (ewoc--node-start-marker node) nil)
+      (setf L (ewoc--node-left  node)
+            R (ewoc--node-right node)
+            ;; Link neighbors to each other.
+            (ewoc--node-right L) R
+            (ewoc--node-left  R) L
+            ;; Forget neighbors.
+            (ewoc--node-left  node) nil
+            (ewoc--node-right node) nil))))
+
 (defun ewoc-filter (ewoc predicate &rest args)
   "Remove all elements in EWOC for which PREDICATE returns nil.
 Note that the buffer for EWOC will be current-buffer when PREDICATE
@@ -386,28 +408,13 @@
   (ewoc--set-buffer-bind-dll-let* ewoc
       ((node (ewoc--node-nth dll 1))
        (footer (ewoc--footer ewoc))
-       (next nil)
-       (L nil) (R nil)
+       (goodbye nil)
        (inhibit-read-only t))
     (while (not (eq node footer))
-      (setq next (ewoc--node-next dll node))
       (unless (apply predicate (ewoc--node-data node) args)
-        ;; If we are about to delete the node pointed at by last-node,
-        ;; set last-node to nil.
-        (if (eq (ewoc--last-node ewoc) node)
-            (setf (ewoc--last-node ewoc) nil))
-        (delete-region (ewoc--node-start-marker node)
-                       (ewoc--node-start-marker (ewoc--node-next dll node)))
-        (set-marker (ewoc--node-start-marker node) nil)
-        (setf L (ewoc--node-left  node)
-              R (ewoc--node-right node)
-              ;; Link neighbors to each other.
-              (ewoc--node-right L) R
-              (ewoc--node-left  R) L
-              ;; Forget neighbors.
-              (ewoc--node-left  node) nil
-              (ewoc--node-right node) nil))
-      (setq node next))))
+        (push node goodbye))
+      (setq node (ewoc--node-next dll node)))
+    (apply 'ewoc-delete ewoc goodbye)))
 
 (defun ewoc-locate (ewoc &optional pos guess)
   "Return the node that POS (a buffer position) is within.