git.fiddlerwoaroof.com
Browse code

feat: generalize transform-elt to sequences

Edward Langley authored on 15/07/2023 17:17:02
Showing 2 changed files
... ...
@@ -225,9 +225,10 @@
225 225
 
226 226
 (defun transform-elt (elt fun)
227 227
   (lambda (it)
228
-    (append (subseq it 0 elt)
229
-            (list (funcall fun (nth elt it)))
230
-            (subseq it (1+ elt)))))
228
+    (concatenate (type-of it)
229
+                 (subseq it 0 elt)
230
+                 (list (funcall fun (elt it elt)))
231
+                 (subseq it (1+ elt)))))
231 232
 
232 233
 (defun key-transform (fun key-get key-set)
233 234
   (lambda (it)
... ...
@@ -259,3 +259,18 @@
259 259
   (5am:is (equalp #(1 2 3)
260 260
                   (funcall (data-lens:over '1+ :result-type 'vector)
261 261
                            #(0 1 2)))))
262
+
263
+(5am:def-test transform-elt (:suite :data-lens.lens :depends-on (and functionalize))
264
+  (5am:is (equal '(1 1 2)
265
+                 (funcall (data-lens:transform-elt 0 '1+)
266
+                          '(0 1 2))))
267
+  (5am:is (equal '(0 2 2)
268
+                 (funcall (data-lens:transform-elt 1 '1+)
269
+                          '(0 1 2))))
270
+  (5am:is (equalp #(0 1 3)
271
+                  (funcall (data-lens:transform-elt 2 '1+)
272
+                           (vector 0 1 2))))
273
+  (5am:is (equal "Abc"
274
+                 (funcall (data-lens:transform-elt 0 'char-upcase)
275
+                          "abc")))
276
+  )