Improve seq-concatenate for new sequence types

Use the new `seq-into-sequence' in seqs passed to `seq-concatenate' to
ensure that concatenation happens on sequences only.  This makes it
possible to use `seq-concatenate' for new types of seqs.

* lisp/emacs-lisp/seq.el (seq-into-sequence, seq-concatenate): New
function used in `seq-concatenate'.
* test/automated/seq-tests.el (test-seq-into-sequence): New unit test
for seq-into-sequence.
This commit is contained in:
Nicolas Petton 2015-08-27 00:21:38 +02:00
parent 64fbdc9825
commit 259a643d7f
2 changed files with 17 additions and 1 deletions

View file

@ -48,6 +48,7 @@
;; - `seq-do'
;; - `seq-p'
;; - `seq-subseq'
;; - `seq-into-sequence'
;; - `seq-copy'
;; - `seq-into'
;;
@ -200,7 +201,17 @@ The result is a sequence of the same type as SEQ."
TYPE must be one of following symbols: vector, string or list.
\n(fn TYPE SEQUENCE...)"
(apply #'cl-concatenate type seqs))
(apply #'cl-concatenate type (seq-map #'seq-into-sequence seqs)))
(cl-defgeneric seq-into-sequence (seq)
"Convert SEQ into a sequence.
The default implementation is to signal an error if SEQ is not a
sequence, specific functions should be implemented for new types
of seq."
(unless (sequencep seq)
(error "Cannot convert %S into a sequence" seq))
seq)
(cl-defgeneric seq-into (seq type)
"Convert the sequence SEQ into a sequence of type TYPE.

View file

@ -312,5 +312,10 @@ Evaluate BODY for each created sequence.
(should (= (seq-min seq) 0))
(should (= (seq-max seq) 5))))
(ert-deftest test-seq-into-sequence ()
(with-test-sequences (seq '(1 2 3))
(should (eq seq (seq-into-sequence seq)))
(should-error (seq-into-sequence 2))))
(provide 'seq-tests)
;;; seq-tests.el ends here