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
|
||||
(:shadow :set)
|
||||
(: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)
|
||||
|
||||
#+fw.dev
|
||||
@ -168,6 +169,16 @@ contain the new value at the location focused by the lens."
|
||||
:from-end t))
|
||||
(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)
|
||||
"A lens for updating a plist, preserving previous values"
|
||||
(lambda (cb)
|
||||
|
||||
Reference in New Issue
Block a user