diff --git a/lens.lisp b/lens.lisp index 21fca6e..4bbda76 100644 --- a/lens.lisp +++ b/lens.lisp @@ -225,9 +225,10 @@ (defun transform-elt (elt fun) (lambda (it) - (append (subseq it 0 elt) - (list (funcall fun (nth elt it))) - (subseq it (1+ elt))))) + (concatenate (type-of it) + (subseq it 0 elt) + (list (funcall fun (elt it elt))) + (subseq it (1+ elt))))) (defun key-transform (fun key-get key-set) (lambda (it) diff --git a/t/lens.lisp b/t/lens.lisp index 099f10e..953dc15 100644 --- a/t/lens.lisp +++ b/t/lens.lisp @@ -259,3 +259,18 @@ (5am:is (equalp #(1 2 3) (funcall (data-lens:over '1+ :result-type 'vector) #(0 1 2))))) + +(5am:def-test transform-elt (:suite :data-lens.lens :depends-on (and functionalize)) + (5am:is (equal '(1 1 2) + (funcall (data-lens:transform-elt 0 '1+) + '(0 1 2)))) + (5am:is (equal '(0 2 2) + (funcall (data-lens:transform-elt 1 '1+) + '(0 1 2)))) + (5am:is (equalp #(0 1 3) + (funcall (data-lens:transform-elt 2 '1+) + (vector 0 1 2)))) + (5am:is (equal "Abc" + (funcall (data-lens:transform-elt 0 'char-upcase) + "abc"))) + )