mirror of
https://github.com/fiddlerwoaroof/data-lens.git
synced 2025-11-08 10:16:32 +00:00
Add a lens for modifying the elements in a list
This commit is contained in:
13
lens.lisp
13
lens.lisp
@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user