branch: elpa/annotate
commit d8f8505d2816beb1f2d2f7b932c642526ad4f84c
Author: cage <cage@invalid>
Commit: cage <cage@invalid>

    - optimized 'annotate-annotations-overlay-in-range' by jumping from an 
annotation to another, instead of scanning every single character of the buffer.
---
 annotate.el | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/annotate.el b/annotate.el
index 98597284fe..013f85c930 100644
--- a/annotate.el
+++ b/annotate.el
@@ -1501,18 +1501,21 @@ surrounded by `BEGIN' and `END'."
 (defun annotate-annotations-overlay-in-range (from-position to-position)
   "Return the annotations overlays that are enclosed in the range
 defined by `FROM-POSITION' and `TO-POSITION'."
-  (let ((annotations ()))
-    (cl-loop for  i
-             from (max 0 (1- from-position))
-             to   to-position
-             do
-      (let ((annotation (annotate-next-annotation-starts i)))
-        (annotate-ensure-annotation (annotation)
-          (let ((chain-end   (overlay-end   (annotate-chain-last  annotation)))
-                (chain-start (overlay-start (annotate-chain-first 
annotation))))
-            (when (and (>= chain-start from-position)
-                       (<= chain-end   to-position))
-              (cl-pushnew annotation annotations))))))
+  (let ((annotations ())
+       (counter (max 0 (1- from-position))))
+    (catch 'scan-loop
+      (while (<= counter
+                 to-position)
+       (cl-incf counter)
+       (let ((annotation (annotate-next-annotation-starts counter)))
+          (if (annotationp annotation)
+              (let ((chain-end   (overlay-end   (annotate-chain-last  
annotation)))
+                    (chain-start (overlay-start (annotate-chain-first 
annotation))))
+               (setf counter chain-end)
+               (when (and (>= chain-start from-position)
+                          (<= chain-end   to-position))
+                 (cl-pushnew annotation annotations)))
+           (throw 'scan-loop t)))))
     (reverse annotations)))
 
 (defun annotate-annotations-chain-in-range (from-position to-position)

Reply via email to