branch: master
commit 99539e8450a6aef29e32de39df85a69104d49e37
Author: Dmitry Gutov <[email protected]>
Commit: Dmitry Gutov <[email protected]>

    Rewrite mmm-regions-alist for performance
    
    Not much improvement here, but at least we don't iterate multiple times 
over the
    same list now.
---
 mmm-region.el | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/mmm-region.el b/mmm-region.el
index 5a14839..04ba779 100644
--- a/mmm-region.el
+++ b/mmm-region.el
@@ -716,20 +716,23 @@ union covers the region from START to STOP, including 
delimiters."
     (setcdr (last regions 2) nil)
     regions))
 
-
 (defun mmm-regions-alist (start stop)
   "Return a list of lists of the form \(MODE . REGIONS) where REGIONS
 is a list of elements of the form \(BEG END). The disjoint union all
 of the REGIONS covers START to STOP."
-  (let ((regions (mmm-regions-in start stop)))
-    (mapcar #'(lambda (mode)
-                (cons mode
-                      (mapcan #'(lambda (region)
-                                  (if (eq mode (car region))
-                                      (list (cdr region))))
-                              regions)))
-            ;; All the modes
-            (remove-duplicates (mapcar #'car regions)))))
+  (let ((regions (mmm-regions-in start stop))
+        alist)
+    (mapc (lambda (region)
+            (let* ((mode (car region))
+                   (elem (cdr region))
+                   (kv (assoc mode alist)))
+              (if kv
+                  (push elem (cdr kv))
+                (push (cons mode (list elem)) alist))))
+          regions)
+    (mapcar (lambda (kv)
+              (cons (car kv) (nreverse (cdr kv))))
+            alist)))
 
 ;;}}}
 ;;{{{ Fontify Regions

Reply via email to