summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Ingebrigtsen <larsi@gnus.org>2021-09-29 17:25:01 +0200
committerLars Ingebrigtsen <larsi@gnus.org>2021-09-29 17:28:02 +0200
commitb4b4cc98ac271d079916a4c412e134fe5b4ba4d8 (patch)
treeb512da9839cf37fa37322df806406de4297dcc31
parente457cff3f48b6fc3fe9efc30b9896181c59011da (diff)
downloademacs-b4b4cc98ac271d079916a4c412e134fe5b4ba4d8.tar.gz
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.
-rw-r--r--lisp/emacs-lisp/seq.el1
-rw-r--r--lisp/gnus/gnus-cite.el4
-rw-r--r--lisp/gnus/gnus-range.el9
-rw-r--r--lisp/gnus/gnus-sum.el5
-rw-r--r--lisp/gnus/gnus-uu.el2
-rw-r--r--lisp/gnus/nnimap.el10
-rw-r--r--lisp/gnus/spam.el14
7 files changed, 27 insertions, 18 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 52c080388b7..451ff196316 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 34947cece89..e9c912109e2 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 7d12ae9fdcc..456209f3d9a 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 b3d0460032d..d790655aa90 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 f7b761ee339..778a8a3ea03 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 8a48cd87dba..059101c8907 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 3f978918b9a..d00f0a60b66 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)