From 656ee24966c17ed505acc2faded2da505e9c7052 Mon Sep 17 00:00:00 2001
From: Philipp Mildenberger
Date: Wed, 5 Apr 2023 20:03:41 +0200
Subject: Simplify gutter diagnostics rendering by using partition_point
 instead of binary search

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>
---
 helix-view/src/gutter.rs | 42 +++++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

(limited to 'helix-view')

diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs
index 475ec5a3..d11cbe4d 100644
--- a/helix-view/src/gutter.rs
+++ b/helix-view/src/gutter.rs
@@ -1,6 +1,6 @@
 use std::fmt::Write;
 
-use helix_core::{syntax::LanguageServerFeature, Diagnostic};
+use helix_core::syntax::LanguageServerFeature;
 
 use crate::{
     editor::GutterType,
@@ -65,35 +65,27 @@ pub fn diagnostic<'doc>(
                 return None;
             }
             use helix_core::diagnostic::Severity;
-            if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
-                let on_line_and_is_visible = |d: &&Diagnostic| {
+            let first_diag_idx_maybe_on_line = diagnostics.partition_point(|d| d.line < line);
+            if first_diag_idx_maybe_on_line == diagnostics.len() {
+                return None;
+            }
+            let diagnostics_on_line = diagnostics[first_diag_idx_maybe_on_line..]
+                .iter()
+                .take_while(|d| {
                     d.line == line
                         && doc
                             .language_servers_with_feature(LanguageServerFeature::Diagnostics)
                             .any(|ls| ls.id() == d.language_server_id)
-                };
-                let after = diagnostics[index..]
-                    .iter()
-                    .take_while(on_line_and_is_visible);
-
-                let before = diagnostics[..index]
-                    .iter()
-                    .rev()
-                    .take_while(on_line_and_is_visible);
-
-                let diagnostics_on_line = after.chain(before);
-
-                if let Some(diagnostic) = diagnostics_on_line.max_by_key(|d| d.severity) {
-                    write!(out, "●").ok();
-                    return Some(match diagnostic.severity {
-                        Some(Severity::Error) => error,
-                        Some(Severity::Warning) | None => warning,
-                        Some(Severity::Info) => info,
-                        Some(Severity::Hint) => hint,
-                    });
+                });
+            diagnostics_on_line.max_by_key(|d| d.severity).map(|d| {
+                write!(out, "●").ok();
+                match d.severity {
+                    Some(Severity::Error) => error,
+                    Some(Severity::Warning) | None => warning,
+                    Some(Severity::Info) => info,
+                    Some(Severity::Hint) => hint,
                 }
-            }
-            None
+            })
         },
     )
 }
-- 
cgit v1.2.3-70-g09d2