Browse code
Add a lens for modifying the elements in a list
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) |