emacs-diffs
[Top][All Lists]
Advanced

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

feature/cl-lib-improvements 1f6fdf123bf: (seq-contains-pred): Split off


From: Dmitry Gutov
Subject: feature/cl-lib-improvements 1f6fdf123bf: (seq-contains-pred): Split off list-specialized impl into separate method
Date: Mon, 20 Nov 2023 21:03:12 -0500 (EST)

branch: feature/cl-lib-improvements
commit 1f6fdf123bf393ea36ace9dfe1bd97a894996ed7
Author: Dmitry Gutov <dmitry@gutov.dev>
Commit: Dmitry Gutov <dmitry@gutov.dev>

    (seq-contains-pred): Split off list-specialized impl into separate method
    
    * lisp/emacs-lisp/seq.el (seq-contains-pred): Split off
    list-specialized impl into separate method.  The result is a bit
    slower (about 10%?), but better structured.
---
 lisp/emacs-lisp/seq.el | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 832a49d7845..d85c7297ee0 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -463,22 +463,25 @@ whether an element was found or not."
 ;;    (t
 ;;     (cl-call-next-method))))
 
-(cl-defgeneric seq-contains-pred (sequence &optional testfn)
+(cl-defgeneric seq-contains-pred (_sequence &optional testfn)
+  (lambda (elt sequence)
+    (catch 'seq--break
+      (seq-doseq (e sequence)
+        (let ((r (funcall testfn e elt)))
+          (when r
+            (throw 'seq--break r))))
+      nil)))
+
+(cl-defmethod seq-contains-pred ((_sequence list) &optional testfn)
   (cond
-   ((and (listp sequence) (or (null testfn) (eq testfn 'equal)))
+   ((or (null testfn) (eq testfn 'equal))
     #'member)
-   ((and (listp sequence) (eq testfn 'eql))
+   ((eq testfn 'eql)
     #'memql)
-   ((and (listp sequence) (eq testfn 'eq))
+   ((eq testfn 'eq)
     #'memq)
    (t
-    (lambda (elt sequence)
-      (catch 'seq--break
-        (seq-doseq (e sequence)
-          (let ((r (funcall testfn e elt)))
-            (when r
-              (throw 'seq--break r))))
-        nil)))))
+    (cl-call-next-method))))
 
 (cl-defgeneric seq-set-equal-p (sequence1 sequence2 &optional testfn)
   "Return non-nil if SEQUENCE1 and SEQUENCE2 contain the same elements.



reply via email to

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