Do not signal an error when trying to delete a key from an array

* lisp/emacs-lisp/map.el (map-delete): When map is an array, check if
the key is present to avoid signaling an error.

* test/automated/map-tests.el: Add a test for deleting non-existing
keys from maps.
This commit is contained in:
Nicolas Petton 2015-04-24 19:29:59 +02:00
parent 79d9757c23
commit d75151a671
2 changed files with 13 additions and 3 deletions

View file

@ -73,7 +73,7 @@ If MAP is an array, store nil at the index KEY."
(map--dispatch (m ,map m) (map--dispatch (m ,map m)
:list (setq ,map (map--delete-alist m ,key)) :list (setq ,map (map--delete-alist m ,key))
:hash-table (remhash ,key m) :hash-table (remhash ,key m)
:array (aset m ,key nil)))) :array (map--delete-array m ,key))))
(defun map-nested-elt (map keys &optional default) (defun map-nested-elt (map keys &optional default)
"Travserse MAP using KEYS and return the looked up value or DEFAULT if nil. "Travserse MAP using KEYS and return the looked up value or DEFAULT if nil.
@ -261,13 +261,20 @@ form.
(seq-elt map key)) (seq-elt map key))
default))) default)))
(defun map--delete-alist (map key) (defun map--delete-alist (map key)
"Return MAP with KEY removed." "Return MAP with KEY removed."
(seq-remove (lambda (pair) (seq-remove (lambda (pair)
(equal key (car pair))) (equal key (car pair)))
map)) map))
(defun map--delete-array (map key)
"Set nil in the array MAP at the index KEY if present and return MAP."
(let ((len (seq-length map)))
(and (>= key 0)
(<= key len)
(aset m key nil)))
map)
(defun map--into-hash-table (map) (defun map--into-hash-table (map)
"Convert MAP into a hash-table." "Convert MAP into a hash-table."
(let ((ht (make-hash-table :size (map-length map) (let ((ht (make-hash-table :size (map-length map)

View file

@ -96,7 +96,10 @@ Evaluate BODY for each created map.
(ert-deftest test-map-delete () (ert-deftest test-map-delete ()
(with-maps-do map (with-maps-do map
(map-delete map 1) (map-delete map 1)
(assert (null (map-elt map 1))))) (assert (null (map-elt map 1))))
(with-maps-do map
(map-delete map -2)
(assert (null (map-elt map -2)))))
(ert-deftest test-map-delete-return-value () (ert-deftest test-map-delete-return-value ()
(let ((ht (make-hash-table))) (let ((ht (make-hash-table)))