]> git.eshelyaron.com Git - emacs.git/commitdiff
Slightly faster hash-table-keys and hash-table-values
authorMattias Engdegård <mattiase@acm.org>
Fri, 17 Jun 2022 17:13:33 +0000 (19:13 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 17 Jun 2022 17:16:52 +0000 (19:16 +0200)
* lisp/emacs-lisp/subr-x.el (hash-table-keys, hash-table-values):
Omit the reversal of the returned list.  It is not ordered anyway.
* test/lisp/emacs-lisp/subr-x-tests.el
(subr-x--hash-table-keys-and-values): New test.

lisp/emacs-lisp/subr-x.el
test/lisp/emacs-lisp/subr-x-tests.el

index 9cd793d05c5e5cbc4c8d9282fd81427279dfb6dc..5c3dff62c8ae552ee6009989462239961378f2d5 100644 (file)
@@ -87,11 +87,15 @@ threading."
 
 (defsubst hash-table-keys (hash-table)
   "Return a list of keys in HASH-TABLE."
-  (cl-loop for k being the hash-keys of hash-table collect k))
+  (let ((keys nil))
+    (maphash (lambda (k _) (push k keys)) hash-table)
+    keys))
 
 (defsubst hash-table-values (hash-table)
   "Return a list of values in HASH-TABLE."
-  (cl-loop for v being the hash-values of hash-table collect v))
+  (let ((values nil))
+    (maphash (lambda (_ v) (push v values)) hash-table)
+    values))
 
 (defsubst string-empty-p (string)
   "Check whether STRING is empty."
index 7f3916c2c0b06fb3750941c073b0327a71d960a8..0bec9db36e9c8de2a9201042da7f7963e2160ea9 100644 (file)
           (with-current-buffer inner
             (should-not (buffer-modified-p))))))))
 
+(ert-deftest subr-x--hash-table-keys-and-values ()
+  (let ((h (make-hash-table)))
+    (puthash 'a 1 h)
+    (puthash 'c 3 h)
+    (puthash 'b 2 h)
+    (should (equal (sort (hash-table-keys h) #'string<) '(a b c)))
+    (should (equal (sort (hash-table-values h) #'<) '(1 2 3)))))
 
 (provide 'subr-x-tests)
 ;;; subr-x-tests.el ends here