]> git.eshelyaron.com Git - emacs.git/commitdiff
(ewoc-delete): New function.
authorThien-Thi Nguyen <ttn@gnuvola.org>
Tue, 23 May 2006 07:31:45 +0000 (07:31 +0000)
committerThien-Thi Nguyen <ttn@gnuvola.org>
Tue, 23 May 2006 07:31:45 +0000 (07:31 +0000)
(ewoc-filter): Use `ewoc-delete'.

lisp/ChangeLog
lisp/emacs-lisp/ewoc.el

index 8249b0d777342c1f37b1f73f4591c3270144b925..6ad38600eaef1098b3bac766a0478ccea3f2913d 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-23  Thien-Thi Nguyen  <ttn@gnu.org>
+
+       * emacs-lisp/ewoc.el (ewoc-delete): New function.
+       (ewoc-filter): Use `ewoc-delete'.
+
 2006-05-22  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * textmodes/bibtex.el (bibtex-format-entry, bibtex-clean-entry):
index 66bb0842da673cb8c3815c3e4c069bf22b41568a..2cb90738072feba1e58b24b843a3b1c875c3bac7 100644 (file)
 ;; (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 @@ arguments will be passed to MAP-FUNCTION."
             (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 @@ ARGS are given they will be passed to the PREDICATE."
   (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.