emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master b4b4cc9 1/2: Revert "Obsolete local set difference functions in f


From: Lars Ingebrigtsen
Subject: master b4b4cc9 1/2: Revert "Obsolete local set difference functions in favor of seq-difference"
Date: Wed, 29 Sep 2021 11:28:07 -0400 (EDT)

branch: master
commit b4b4cc98ac271d079916a4c412e134fe5b4ba4d8
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Revert "Obsolete local set difference functions in favor of seq-difference"
    
    This reverts commit 20f7fa691b7c2859b96550d9ccb326bf394e160d.
    
    gnus-set-difference is orders of magnitude faster than seq-difference
    (on these sets), and using seq-difference makes nnimap too
    slow.
---
 lisp/emacs-lisp/seq.el  |  1 -
 lisp/gnus/gnus-cite.el  |  4 ++--
 lisp/gnus/gnus-range.el |  9 +++++++--
 lisp/gnus/gnus-sum.el   |  5 ++---
 lisp/gnus/gnus-uu.el    |  2 +-
 lisp/gnus/nnimap.el     | 10 ++++------
 lisp/gnus/spam.el       | 14 +++++++++++---
 7 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 52c0803..451ff19 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -490,7 +490,6 @@ Equality is defined by TESTFN if non-nil or by `equal' if 
nil."
               (seq-reverse sequence1)
               '()))
 
-;;;###autoload
 (cl-defgeneric seq-difference (sequence1 sequence2 &optional testfn)
   "Return a list of the elements that appear in SEQUENCE1 but not in SEQUENCE2.
 Equality is defined by TESTFN if non-nil or by `equal' if nil."
diff --git a/lisp/gnus/gnus-cite.el b/lisp/gnus/gnus-cite.el
index 34947ce..e9c9121 100644
--- a/lisp/gnus/gnus-cite.el
+++ b/lisp/gnus/gnus-cite.el
@@ -839,7 +839,7 @@ See also the documentation for 
`gnus-article-highlight-citation'."
                 (setq current (car loop)
                       loop (cdr loop))
                 (setcdr current
-                         (seq-difference (cdr current) numbers #'eq)))))))))
+                        (gnus-set-difference (cdr current) numbers)))))))))
 
 (defun gnus-cite-parse-attributions ()
   (let (al-alist)
@@ -999,7 +999,7 @@ See also the documentation for 
`gnus-article-highlight-citation'."
                    loop (cdr loop))
              (if (eq current best)
                  ()
-                (setcdr current (seq-difference (cdr current) numbers #'eq))
+               (setcdr current (gnus-set-difference (cdr current) numbers))
                (when (null (cdr current))
                  (setq gnus-cite-loose-prefix-alist
                        (delq current gnus-cite-loose-prefix-alist)
diff --git a/lisp/gnus/gnus-range.el b/lisp/gnus/gnus-range.el
index 7d12ae9..456209f 100644
--- a/lisp/gnus/gnus-range.el
+++ b/lisp/gnus/gnus-range.el
@@ -42,8 +42,13 @@ If RANGE is a single range, return (RANGE).  Otherwise, 
return RANGE."
 
 (defun gnus-set-difference (list1 list2)
   "Return a list of elements of LIST1 that do not appear in LIST2."
-  (declare (obsolete seq-difference "28.1"))
-  (seq-difference list1 list2 #'eq))
+  (let ((hash2 (make-hash-table :test 'eq))
+        (result nil))
+    (dolist (elt list2) (puthash elt t hash2))
+    (dolist (elt list1)
+      (unless (gethash elt hash2)
+        (setq result (cons elt result))))
+    (nreverse result)))
 
 (defun gnus-range-nconcat (&rest ranges)
   "Return a range comprising all the RANGES, which are pre-sorted.
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index b3d0460..d790655 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -8590,9 +8590,8 @@ If UNREPLIED (the prefix), limit to unreplied articles."
   (interactive "P" gnus-summary-mode)
   (if unreplied
       (gnus-summary-limit
-       (seq-difference gnus-newsgroup-articles
-                       gnus-newsgroup-replied
-                       #'eq))
+       (gnus-set-difference gnus-newsgroup-articles
+       gnus-newsgroup-replied))
     (gnus-summary-limit gnus-newsgroup-replied))
   (gnus-summary-position-point))
 
diff --git a/lisp/gnus/gnus-uu.el b/lisp/gnus/gnus-uu.el
index f7b761e..778a8a3 100644
--- a/lisp/gnus/gnus-uu.el
+++ b/lisp/gnus/gnus-uu.el
@@ -579,7 +579,7 @@ didn't work, and overwrite existing files.  Otherwise, ask 
each time."
 (defun gnus-new-processable (unmarkp articles)
   (if unmarkp
       (nreverse (seq-intersection gnus-newsgroup-processable articles #'eq))
-    (seq-difference articles gnus-newsgroup-processable #'eq)))
+    (gnus-set-difference articles gnus-newsgroup-processable)))
 
 (defun gnus-uu-mark-by-regexp (regexp &optional unmark)
   "Set the process mark on articles whose subjects match REGEXP.
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 8a48cd8..059101c 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -1638,15 +1638,13 @@ If LIMIT, first try to limit the search to the N last 
articles."
              (setq start-article 1))
            (let* ((unread
                    (gnus-compress-sequence
-                     (seq-difference
-                      (seq-difference
+                    (gnus-set-difference
+                     (gnus-set-difference
                       existing
                       (gnus-sorted-union
                        (cdr (assoc '%Seen flags))
-                        (cdr (assoc '%Deleted flags)))
-                       #'eq)
-                      (cdr (assoc '%Flagged flags))
-                      #'eq)))
+                       (cdr (assoc '%Deleted flags))))
+                     (cdr (assoc '%Flagged flags)))))
                   (read (gnus-range-difference
                          (cons start-article high) unread)))
              (when (> start-article 1)
diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el
index 3f97891..d00f0a6 100644
--- a/lisp/gnus/spam.el
+++ b/lisp/gnus/spam.el
@@ -710,8 +710,16 @@ finds ham or spam.")
 (defun spam-set-difference (list1 list2)
   "Return a set difference of LIST1 and LIST2.
 When either list is nil, the other is returned."
-  (declare (obsolete seq-difference "28.1"))
-  (seq-difference list1 list2 #'eq))
+  (if (and list1 list2)
+      ;; we have two non-nil lists
+      (progn
+        (dolist (item (append list1 list2))
+          (when (and (memq item list1) (memq item list2))
+            (setq list1 (delq item list1))
+            (setq list2 (delq item list2))))
+        (append list1 list2))
+    ;; if either of the lists was nil, return the other one
+    (if list1 list1 list2)))
 
 (defun spam-group-ham-mark-p (group mark &optional spam)
   "Checks if MARK is considered a ham mark in GROUP."
@@ -1319,7 +1327,7 @@ In the case of mover backends, checks the setting of
              (new-articles (spam-list-articles
                             gnus-newsgroup-articles
                             classification))
-             (changed-articles (seq-difference new-articles old-articles 
#'eq)))
+             (changed-articles (spam-set-difference new-articles 
old-articles)))
         ;; now that we have the changed articles, we go through the processors
         (dolist (backend (spam-backend-list))
           (let (unregister-list)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]