Cleaner API

This commit is contained in:
Aleksey Kladov 2021-01-10 14:36:15 +03:00
parent 3a6ae42eac
commit fc3fc571d2
3 changed files with 10 additions and 9 deletions

View file

@ -51,18 +51,20 @@ impl Node {
} }
} }
let (start, len) = let overlapping =
equal_range_by(&self.nested, |n| ordering(n.hl_range.range, hl_range.range)); equal_range_by(&self.nested, |n| ordering(n.hl_range.range, hl_range.range));
if len == 1 && self.nested[start].hl_range.range.contains_range(hl_range.range) { if overlapping.len() == 1
return self.nested[start].add(hl_range); && self.nested[overlapping.start].hl_range.range.contains_range(hl_range.range)
{
return self.nested[overlapping.start].add(hl_range);
} }
let nested = self let nested = self
.nested .nested
.splice(start..start + len, iter::once(Node::new(hl_range))) .splice(overlapping.clone(), iter::once(Node::new(hl_range)))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
self.nested[start].nested = nested; self.nested[overlapping.start].nested = nested;
} }
fn flatten(&self, acc: &mut Vec<HlRange>) { fn flatten(&self, acc: &mut Vec<HlRange>) {

View file

@ -33,8 +33,7 @@ impl Injector {
&self.buf &self.buf
} }
pub(super) fn map_range_up(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ { pub(super) fn map_range_up(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
let (start, len) = equal_range_by(&self.ranges, |&(r, _)| ordering(r, range)); equal_range_by(&self.ranges, |&(r, _)| ordering(r, range)).filter_map(move |i| {
(start..start + len).filter_map(move |i| {
let (target_range, delta) = self.ranges[i]; let (target_range, delta) = self.ranges[i];
let intersection = target_range.intersect(range).unwrap(); let intersection = target_range.intersect(range).unwrap();
Some(intersection + delta?) Some(intersection + delta?)

View file

@ -152,13 +152,13 @@ where
left left
} }
pub fn equal_range_by<T, F>(slice: &[T], mut key: F) -> (usize, usize) pub fn equal_range_by<T, F>(slice: &[T], mut key: F) -> ops::Range<usize>
where where
F: FnMut(&T) -> Ordering, F: FnMut(&T) -> Ordering,
{ {
let start = partition_point(slice, |it| key(it) == Ordering::Less); let start = partition_point(slice, |it| key(it) == Ordering::Less);
let len = partition_point(&slice[start..], |it| key(it) == Ordering::Equal); let len = partition_point(&slice[start..], |it| key(it) == Ordering::Equal);
(start, len) start..start + len
} }
pub struct JodChild(pub process::Child); pub struct JodChild(pub process::Child);