diff --git a/data-lens-fset.lisp b/data-lens-fset.lisp index fc4f872..c953f37 100644 --- a/data-lens-fset.lisp +++ b/data-lens-fset.lisp @@ -17,9 +17,9 @@ (data-lens.transducers:transducer-lambda ((acc next) (fset:with acc next)))) -(defmethod data-lens:functionalize ((it fset:set)) - (lambda (key) - (nth-value 1 (fset:lookup it key)))) +(defmethod data-lens:functionalize ((set fset:set)) + (lambda (it) + (fset:contains? set it))) (defmethod data-lens:extract-key ((it fset:set) key) (nth-value 1 (fset:lookup it key))) (defun make-set-lens (item) @@ -114,3 +114,4 @@ (funcall (funcall (make-set-lens loc) cb) rec)) + diff --git a/optics.lisp b/optics.lisp index 0367eaf..10bfe9a 100644 --- a/optics.lisp +++ b/optics.lisp @@ -210,8 +210,8 @@ contain the new value at the location focused by the lens." (defun a-lens (cb) (lambda (foo) (fw.lu:prog1-bind (new (clone foo)) - (setf (a new) - (funcall cb (a foo)))))) + (setf (a new) + (funcall cb (a foo)))))) (view 'a-lens (over 'a-lens '1+ (set 'a-lens 2 @@ -222,10 +222,14 @@ contain the new value at the location focused by the lens." (:method ((rec hash-table) cb loc) (funcall (funcall (make-hash-table-lens loc) cb) + rec)) + (:method ((rec vector) cb loc) + (funcall (funcall (make-list-lens loc) + cb) rec))) (defun lens (loc) - "A lens for updating a hash-table, discarding previous values" + "extensible lens using a multimethod for internal implementation" (lambda (cb) (lambda (rec) (generic-lens rec cb loc)))) diff --git a/transducer-protocol.lisp b/transducer-protocol.lisp index 6035a25..d615436 100644 --- a/transducer-protocol.lisp +++ b/transducer-protocol.lisp @@ -56,8 +56,10 @@ CONSTRAINT: SEQ should be copied, not modified")) +(declaim (inline exit-early)) (defun exit-early (acc) (throw 'done acc)) +(declaim (notinline exit-early)) (defun transduce (xf build seq) (let* ((xf (etypecase xf