git.fiddlerwoaroof.com
Browse code

Add a lens for modifying the elements in a list

Ed Langley authored on 29/08/2019 15:10:41
Showing 1 changed files
... ...
@@ -1,7 +1,8 @@
1 1
 (defpackage :data-lens.lenses
2 2
   (:shadow :set)
3 3
   (:use :cl)
4
-  (:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens))
4
+  (:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens
5
+           :make-list-lens))
5 6
 (in-package :data-lens.lenses)
6 7
 
7 8
 #+fw.dev
... ...
@@ -168,6 +169,16 @@ contain the new value at the location focused by the lens."
168 169
                                  :from-end t))
169 170
             (funcall cb (serapeum:assocdr key alist))))))
170 171
 
172
+(defun make-list-lens (index)
173
+  "A lens for updating a sequence"
174
+  (lambda (cb)
175
+    (lambda (seq)
176
+      (fmap (lambda (new)
177
+              (let ((result (copy-seq seq)))
178
+                (prog1 result
179
+                  (setf (elt result index) new))))
180
+            (funcall cb (elt seq index))))))
181
+
171 182
 (defun make-plist-lens (key)
172 183
   "A lens for updating a plist, preserving previous values"
173 184
   (lambda (cb)