Add a lens for modifying the elements in a list

This commit is contained in:
Ed Langley
2019-08-29 10:10:41 -05:00
parent afcb3d3a3c
commit a224381307

View File

@ -1,7 +1,8 @@
(defpackage :data-lens.lenses (defpackage :data-lens.lenses
(:shadow :set) (:shadow :set)
(:use :cl) (:use :cl)
(:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens)) (:export :over :set :view :make-alist-lens :make-plist-lens :make-hash-table-lens
:make-list-lens))
(in-package :data-lens.lenses) (in-package :data-lens.lenses)
#+fw.dev #+fw.dev
@ -168,6 +169,16 @@ contain the new value at the location focused by the lens."
:from-end t)) :from-end t))
(funcall cb (serapeum:assocdr key alist)))))) (funcall cb (serapeum:assocdr key alist))))))
(defun make-list-lens (index)
"A lens for updating a sequence"
(lambda (cb)
(lambda (seq)
(fmap (lambda (new)
(let ((result (copy-seq seq)))
(prog1 result
(setf (elt result index) new))))
(funcall cb (elt seq index))))))
(defun make-plist-lens (key) (defun make-plist-lens (key)
"A lens for updating a plist, preserving previous values" "A lens for updating a plist, preserving previous values"
(lambda (cb) (lambda (cb)