1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-06 06:20:55 -08:00

* lisp/emacs-lisp/map.el: Fix recent changes

(map-empty-p): Add method for lists which avoids computing their
entire length.
(map-contains-key): Check for alist membership by comparing against
DEFAULT argument returned by alist-get.
(map-put!): Reconcile argument name with that used in docstring.
This commit is contained in:
Basil L. Contovounesios 2018-12-14 14:46:47 +00:00 committed by Stefan Monnier
parent d72b69650e
commit f466b83226

View file

@ -243,6 +243,9 @@ The default implementation delegates to `map-filter'."
The default implementation delegates to `map-length'." The default implementation delegates to `map-length'."
(zerop (map-length map))) (zerop (map-length map)))
(cl-defmethod map-empty-p ((map list))
(null map))
(cl-defgeneric map-contains-key (map key &optional testfn) (cl-defgeneric map-contains-key (map key &optional testfn)
;; FIXME: The test function to use generally depends on the map object, ;; FIXME: The test function to use generally depends on the map object,
;; so specifying `testfn' here is problematic: e.g. for hash-tables ;; so specifying `testfn' here is problematic: e.g. for hash-tables
@ -259,7 +262,8 @@ The default implementation delegates to `map-do'."
nil)) nil))
(cl-defmethod map-contains-key ((map list) key &optional testfn) (cl-defmethod map-contains-key ((map list) key &optional testfn)
(alist-get key map nil nil (or testfn #'equal))) (let ((v '(nil)))
(not (eq v (alist-get key map v nil (or testfn #'equal))))))
(cl-defmethod map-contains-key ((map array) key &optional _testfn) (cl-defmethod map-contains-key ((map array) key &optional _testfn)
(and (integerp key) (and (integerp key)
@ -332,16 +336,16 @@ MAP can be a list, hash-table or array."
;; FIXME: I wish there was a way to avoid this η-redex! ;; FIXME: I wish there was a way to avoid this η-redex!
(cl-defmethod map-into (map (_type (eql list))) (map-pairs map)) (cl-defmethod map-into (map (_type (eql list))) (map-pairs map))
(cl-defgeneric map-put! (map key v) (cl-defgeneric map-put! (map key value)
"Associate KEY with VALUE in MAP and return VALUE. "Associate KEY with VALUE in MAP and return VALUE.
If KEY is already present in MAP, replace the associated value If KEY is already present in MAP, replace the associated value
with VALUE." with VALUE."
(map--dispatch map (map--dispatch map
:list (let ((p (assoc key map))) :list (let ((p (assoc key map)))
(if p (setcdr p v) (if p (setcdr p value)
(error "No place to change the mapping for %S" key))) (error "No place to change the mapping for %S" key)))
:hash-table (puthash key v map) :hash-table (puthash key value map)
:array (aset map key v))) :array (aset map key value)))
;; There shouldn't be old source code referring to `map--put', yet we do ;; There shouldn't be old source code referring to `map--put', yet we do
;; need to keep it for backward compatibility with .elc files where the ;; need to keep it for backward compatibility with .elc files where the