Generalize AnchorRangeMultimap's 'intersecting ranges' API

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Max Brunsfeld 2021-10-26 17:56:39 -07:00
parent 79ba217485
commit f1db618be2
2 changed files with 24 additions and 9 deletions

View File

@ -1,4 +1,4 @@
use super::{Buffer, Content, Point, ToOffset};
use super::{Buffer, Content, FromAnchor, Point, ToOffset};
use anyhow::Result;
use std::{cmp::Ordering, ops::Range};
use sum_tree::{Bias, SumTree};
@ -175,17 +175,16 @@ impl<T: Clone> Default for AnchorRangeMultimap<T> {
}
impl<T: Clone> AnchorRangeMultimap<T> {
pub fn intersecting_point_ranges<'a, O>(
pub fn intersecting_ranges<'a, I, O>(
&'a self,
range: Range<O>,
range: Range<I>,
content: Content<'a>,
inclusive: bool,
) -> impl Iterator<Item = (usize, Range<Point>, &T)> + 'a
) -> impl Iterator<Item = (usize, Range<O>, &T)> + 'a
where
O: ToOffset,
I: ToOffset,
O: FromAnchor,
{
use super::ToPoint as _;
let end_bias = if inclusive { Bias::Right } else { Bias::Left };
let range = range.start.to_full_offset(&content, Bias::Left)
..range.end.to_full_offset(&content, end_bias);
@ -229,10 +228,10 @@ impl<T: Clone> AnchorRangeMultimap<T> {
let ix = *cursor.start();
endpoint.full_offset = item.range.start;
endpoint.bias = self.start_bias;
let start = endpoint.to_point(&content);
let start = O::from_anchor(&endpoint, &content);
endpoint.full_offset = item.range.end;
endpoint.bias = self.end_bias;
let end = endpoint.to_point(&content);
let end = O::from_anchor(&endpoint, &content);
let value = &item.value;
cursor.next(&());
Some((ix, start..end, value))

View File

@ -2523,3 +2523,19 @@ impl ToPoint for usize {
content.into().visible_text.to_point(*self)
}
}
pub trait FromAnchor {
fn from_anchor<'a>(anchor: &Anchor, content: &Content<'a>) -> Self;
}
impl FromAnchor for Point {
fn from_anchor<'a>(anchor: &Anchor, content: &Content<'a>) -> Self {
anchor.to_point(content)
}
}
impl FromAnchor for usize {
fn from_anchor<'a>(anchor: &Anchor, content: &Content<'a>) -> Self {
anchor.to_offset(content)
}
}