aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Petton2016-12-16 11:18:04 +0100
committerNicolas Petton2016-12-16 11:22:00 +0100
commitfb2fdb1435d2520c1cbf2a3d6a53128512a38458 (patch)
tree3c62d01dcc3c4970eb9c8d0caf07a4666a8e3d21
parentcdf5340f51d4346c276102331e3ed29561753b26 (diff)
downloademacs-fb2fdb1435d2520c1cbf2a3d6a53128512a38458.tar.gz
emacs-fb2fdb1435d2520c1cbf2a3d6a53128512a38458.zip
Make seq-into return the sequence when no conversion needed
* lisp/emacs-lisp/seq.el (seq-into): Do not convert the sequence when no conversion is needed. * test/lisp/emacs-lisp/seq-tests.el (test-seq-into-and-identity): Add a regression test checking for identity.
-rw-r--r--lisp/emacs-lisp/seq.el28
-rw-r--r--test/lisp/emacs-lisp/seq-tests.el8
2 files changed, 30 insertions, 6 deletions
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 9890e60614e..74510244be7 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -179,9 +179,7 @@ Return a list of the results.
179\(fn FUNCTION SEQUENCES...)" 179\(fn FUNCTION SEQUENCES...)"
180 (let ((result nil) 180 (let ((result nil)
181 (sequences (seq-map (lambda (s) 181 (sequences (seq-map (lambda (s)
182 (if (listp s) 182 (seq-into s 'list))
183 s
184 (seq-into s 'list)))
185 (cons sequence sequences)))) 183 (cons sequence sequences))))
186 (while (not (memq nil sequences)) 184 (while (not (memq nil sequences))
187 (push (apply function (seq-map #'car sequences)) result) 185 (push (apply function (seq-map #'car sequences)) result)
@@ -275,9 +273,9 @@ of sequence."
275TYPE can be one of the following symbols: vector, string or 273TYPE can be one of the following symbols: vector, string or
276list." 274list."
277 (pcase type 275 (pcase type
278 (`vector (vconcat sequence)) 276 (`vector (seq--into-vector sequence))
279 (`string (concat sequence)) 277 (`string (seq--into-string sequence))
280 (`list (append sequence nil)) 278 (`list (seq--into-list sequence))
281 (_ (error "Not a sequence type name: %S" type)))) 279 (_ (error "Not a sequence type name: %S" type))))
282 280
283(cl-defgeneric seq-filter (pred sequence) 281(cl-defgeneric seq-filter (pred sequence)
@@ -514,6 +512,24 @@ Signal an error if SEQUENCE is empty."
514 (null list)) 512 (null list))
515 513
516 514
515(defun seq--into-list (sequence)
516 "Concatenate the elements of SEQUENCE into a list."
517 (if (listp sequence)
518 sequence
519 (append sequence nil)))
520
521(defun seq--into-vector (sequence)
522 "Concatenate the elements of SEQUENCE into a vector."
523 (if (vectorp sequence)
524 sequence
525 (vconcat sequence)))
526
527(defun seq--into-string (sequence)
528 "Concatenate the elements of SEQUENCE into a string."
529 (if (stringp sequence)
530 sequence
531 (concat sequence)))
532
517(defun seq--activate-font-lock-keywords () 533(defun seq--activate-font-lock-keywords ()
518 "Activate font-lock keywords for some symbols defined in seq." 534 "Activate font-lock keywords for some symbols defined in seq."
519 (font-lock-add-keywords 'emacs-lisp-mode 535 (font-lock-add-keywords 'emacs-lisp-mode
diff --git a/test/lisp/emacs-lisp/seq-tests.el b/test/lisp/emacs-lisp/seq-tests.el
index fc65c9834d6..a7a43471de3 100644
--- a/test/lisp/emacs-lisp/seq-tests.el
+++ b/test/lisp/emacs-lisp/seq-tests.el
@@ -391,5 +391,13 @@ Evaluate BODY for each created sequence.
391 (should (equal (seq-mapn #'+ '(3 4 5 7) l1) 391 (should (equal (seq-mapn #'+ '(3 4 5 7) l1)
392 '(4 5 6 8))))) 392 '(4 5 6 8)))))
393 393
394(ert-deftest test-seq-into-and-identity ()
395 (let ((lst '(1 2 3))
396 (vec [1 2 3])
397 (str "foo bar"))
398 (should (eq (seq-into lst 'list) lst))
399 (should (eq (seq-into vec 'vector) vec))
400 (should (eq (seq-into str 'string) str))))
401
394(provide 'seq-tests) 402(provide 'seq-tests)
395;;; seq-tests.el ends here 403;;; seq-tests.el ends here