(in-package :odb) (defun key (object) (if (consp object) (car object) object)) (defun value (object) (if (consp object) (cdr object) object)) (defun find-key (key list) (whereas ((tail (member key list :test #'lookup= :key #'key))) (values (first tail) tail))) (defmethod get-value ((list list) key) (whereas ((object (find-key key list))) (values (value object) t))) (defmethod map-with-new-kv ((list list) key value) (if (>= (length list) +inline-count+) (map-with-new-kv (make-instance 'btree :new-kv-pairs list) key value) (let ((object (find-key key list))) (cond ((and object (atom object)) list) ((consp object) (setf (cdr object) value) list) (t (insertf (if (eq key +unspecific+) value (cons key value)) list #'lookup< :key #'key)))))) (defmethod map-without-kv ((list list) key) (let ((object (find-key key list))) (if object (delete key list) list)))