]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve seq-concatenate for new sequence types
authorNicolas Petton <nicolas@petton.fr>
Wed, 26 Aug 2015 22:21:38 +0000 (00:21 +0200)
committerNicolas Petton <nicolas@petton.fr>
Wed, 26 Aug 2015 22:29:22 +0000 (00:29 +0200)
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.

lisp/emacs-lisp/seq.el
test/automated/seq-tests.el

index d4a9139758d98b4095902380d2628d3520d05a6b..a17b0a8f1b92e22852af2df1f5b3567de2dcc2bd 100644 (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.
index 163935b543242ac07f0762eedd04fcea64ad16c2..482daeecb983e6f8e13f5c36c39f689d7a30bfaa 100644 (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