]> code.delx.au - gnu-emacs/commitdiff
Add new function map-do
authorNicolas Petton <nicolas@petton.fr>
Sat, 18 Jun 2016 07:42:09 +0000 (09:42 +0200)
committerNicolas Petton <nicolas@petton.fr>
Sat, 18 Jun 2016 08:10:00 +0000 (10:10 +0200)
* lisp/emacs-lisp/map.el (map-do, map--do-alist, map--do-array): New
  functions.
* test/lisp/emacs-lisp/map-tests.el: Add a unit test for map-do.

lisp/emacs-lisp/map.el
test/lisp/emacs-lisp/map-tests.el

index b97d8b1ca6439cd07365a50b7ab596cbd1b86979..7c4afb91304135056d6f4c38235e66a862e1b010 100644 (file)
@@ -4,7 +4,7 @@
 
 ;; Author: Nicolas Petton <nicolas@petton.fr>
 ;; Keywords: convenience, map, hash-table, alist, array
-;; Version: 1.0
+;; Version: 1.1
 ;; Package: map
 
 ;; Maintainer: emacs-devel@gnu.org
@@ -201,6 +201,16 @@ MAP can be a list, hash-table or array."
            function
            map))
 
+(defun map-do (function map)
+  "Apply FUNCTION to each element of MAP and return nil.
+FUNCTION.is called with two arguments, the key and the value."
+  (funcall (map--dispatch map
+             :list #'map--do-alist
+             :hash-table #'maphash
+             :array #'map--do-array)
+           function
+           map))
+
 (defun map-keys-apply (function map)
   "Return the result of applying FUNCTION to each key of MAP.
 
@@ -354,6 +364,20 @@ MAP can be a list, hash-table or array."
                  (setq index (1+ index))))
              map)))
 
+(defun map--do-alist (function alist)
+  "Private function used to iterate over ALIST using FUNCTION."
+  (seq-do (lambda (pair)
+            (funcall function
+                     (car pair)
+                     (cdr pair)))
+          alist))
+
+(defun map--do-array (function array)
+  "Private function usde to iterate over ARRAY using FUNCTION."
+  (seq-do-indexed (lambda (elt index)
+                     (funcall function index elt))
+                   array))
+
 (defun map--into-hash-table (map)
   "Convert MAP into a hash-table."
   (let ((ht (make-hash-table :size (map-length map)
index 20cb0f6b39967a7d16aef7832eaf8b02530ed840..0af1c656e091d1463b218480b5a2b09969f7740d 100644 (file)
@@ -192,6 +192,14 @@ Evaluate BODY for each created map.
                      (2 . b)
                      (3 . c))))))
 
+(ert-deftest test-map-do ()
+  (with-maps-do map
+    (let ((result nil))
+      (map-do (lambda (k v)
+                (add-to-list 'result (list (int-to-string k) v)))
+              map)
+      (should (equal result '(("2" 5) ("1" 4) ("0" 3)))))))
+
 (ert-deftest test-map-keys-apply ()
   (with-maps-do map
     (should (equal (map-keys-apply (lambda (k) (int-to-string k))