branch: externals/compat
commit 3313d69c52097bf2d0a3a4ab646c75bced42bf12
Merge: 9813be3400 1bf572df40
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    Merge branch 'main' into emacs-30
---
 compat-29.el    | 50 ++++++++++++++++++++++++++------------------------
 compat-tests.el | 10 +++++++++-
 2 files changed, 35 insertions(+), 25 deletions(-)

diff --git a/compat-29.el b/compat-29.el
index cd012106ff..5b0a4dfbb3 100644
--- a/compat-29.el
+++ b/compat-29.el
@@ -102,38 +102,40 @@ Unibyte strings are converted to multibyte for 
comparison."
 (compat-defun plist-get (plist prop &optional predicate) ;; 
<compat-tests:plist-get>
   "Handle optional argument PREDICATE."
   :extended t
-  (if (or (null predicate) (eq predicate 'eq))
-      (plist-get plist prop)
-    (catch 'found
-      (while (consp plist)
-        (when (funcall predicate prop (car plist))
-          (throw 'found (cadr plist)))
-        (setq plist (cddr plist))))))
+  (pcase predicate
+    ((or `nil `eq) (plist-get plist prop))
+    (`equal (lax-plist-get plist prop))
+    (_ (catch 'found
+         (while (consp plist)
+           (when (funcall predicate prop (car plist))
+             (throw 'found (cadr plist)))
+           (setq plist (cddr plist)))))))
 
 (compat-defun plist-put (plist prop val &optional predicate) ;; 
<compat-tests:plist-get>
   "Handle optional argument PREDICATE."
   :extended t
-  (if (or (null predicate) (eq predicate 'eq))
-      (plist-put plist prop val)
-    (catch 'found
-      (let ((tail plist))
-        (while (consp tail)
-          (when (funcall predicate prop (car tail))
-            (setcar (cdr tail) val)
-            (throw 'found plist))
-          (setq tail (cddr tail))))
-      (nconc plist (list prop val)))))
+  (pcase predicate
+    ((or `nil `eq) (plist-put plist prop val))
+    (`equal (lax-plist-put plist prop val))
+    (_ (catch 'found
+         (let ((tail plist))
+           (while (consp tail)
+             (when (funcall predicate prop (car tail))
+               (setcar (cdr tail) val)
+               (throw 'found plist))
+             (setq tail (cddr tail))))
+         (nconc plist (list prop val))))))
 
 (compat-defun plist-member (plist prop &optional predicate) ;; 
<compat-tests:plist-get>
   "Handle optional argument PREDICATE."
   :extended t
-  (if (or (null predicate) (eq predicate 'eq))
-      (plist-member plist prop)
-    (catch 'found
-      (while (consp plist)
-        (when (funcall predicate prop (car plist))
-          (throw 'found plist))
-        (setq plist (cddr plist))))))
+  (pcase predicate
+    ((or `nil `eq) (plist-member plist prop))
+    (_ (catch 'found
+         (while (consp plist)
+           (when (funcall predicate prop (car plist))
+             (throw 'found plist))
+           (setq plist (cddr plist)))))))
 
 ;;;; Defined in gv.el
 
diff --git a/compat-tests.el b/compat-tests.el
index b1fec85e60..29d05008a6 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -1050,7 +1050,15 @@
     (should-equal (compat-call plist-get list "first" #'string=) 10)
     (should-equal (compat-call plist-get list "second" #'string=) 2)
     (should (compat-call plist-member list "first" #'string=))
-    (should-not (compat-call plist-member list "third" #'string=))))
+    (should-not (compat-call plist-member list "third" #'string=)))
+  (let (list)
+    (setq list (compat-call plist-put list "first" 1 #'equal))
+    (setq list (compat-call plist-put list "second" 2 #'equal))
+    (setq list (compat-call plist-put list "first" 10 #'equal))
+    (should-equal (compat-call plist-get list "first" #'equal) 10)
+    (should-equal (compat-call plist-get list "second" #'equal) 2)
+    (should (compat-call plist-member list "first" #'equal))
+    (should-not (compat-call plist-member list "third" #'equal))))
 
 (ert-deftest compat-garbage-collect-maybe ()
   (garbage-collect-maybe 10))

Reply via email to