From b7f020d3522fc8c2651d29545d784fc7aa1d8454 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Sat, 15 Jul 2023 10:17:02 -0700 Subject: [PATCH] feat: generalize transform-elt to sequences --- lens.lisp | 7 ++++--- t/lens.lisp | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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"))) + )