Make summaries_for_anchors/summaries_for_anchor_ranges more generic

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Antonio Scandurra 2021-11-25 17:03:06 +01:00
parent 2f43ef67fd
commit 2f78d93383
2 changed files with 39 additions and 22 deletions

View File

@ -142,8 +142,12 @@ impl<T> AnchorMap<T> {
{ {
let content = content.into(); let content = content.into();
content content
.summaries_for_anchors(self) .summaries_for_anchors(
.map(move |(sum, value)| (sum, value)) self.version.clone(),
self.bias,
self.entries.iter().map(|e| &e.0),
)
.zip(self.entries.iter().map(|e| &e.1))
} }
} }
@ -196,7 +200,14 @@ impl<T> AnchorRangeMap<T> {
D: 'a + TextDimension<'a>, D: 'a + TextDimension<'a>,
{ {
let content = content.into(); let content = content.into();
content.summaries_for_anchor_ranges(self) content
.summaries_for_anchor_ranges(
self.version.clone(),
self.start_bias,
self.end_bias,
self.entries.iter().map(|e| &e.0),
)
.zip(self.entries.iter().map(|e| &e.1))
} }
pub fn full_offset_ranges(&self) -> impl Iterator<Item = &(Range<FullOffset>, T)> { pub fn full_offset_ranges(&self) -> impl Iterator<Item = &(Range<FullOffset>, T)> {

View File

@ -1786,43 +1786,49 @@ impl<'a> Content<'a> {
self.visible_text.cursor(range.start).summary(range.end) self.visible_text.cursor(range.start).summary(range.end)
} }
fn summaries_for_anchors<D, T>(&self, map: &'a AnchorMap<T>) -> impl Iterator<Item = (D, &'a T)> fn summaries_for_anchors<D, I>(
&self,
version: clock::Global,
bias: Bias,
ranges: I,
) -> impl 'a + Iterator<Item = D>
where where
D: TextDimension<'a>, D: 'a + TextDimension<'a>,
I: 'a + IntoIterator<Item = &'a FullOffset>,
{ {
let cx = Some(map.version.clone()); let cx = Some(version.clone());
let mut summary = D::default(); let mut summary = D::default();
let mut rope_cursor = self.visible_text.cursor(0); let mut rope_cursor = self.visible_text.cursor(0);
let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>(); let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>();
map.entries.iter().map(move |(offset, value)| { ranges.into_iter().map(move |offset| {
cursor.seek_forward(&VersionedFullOffset::Offset(*offset), map.bias, &cx); cursor.seek_forward(&VersionedFullOffset::Offset(*offset), bias, &cx);
let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) {
*offset - cursor.start().0.full_offset() *offset - cursor.start().0.full_offset()
} else { } else {
0 0
}; };
summary.add_assign(&rope_cursor.summary(cursor.start().1 + overshoot)); summary.add_assign(&rope_cursor.summary(cursor.start().1 + overshoot));
(summary.clone(), value) summary.clone()
}) })
} }
fn summaries_for_anchor_ranges<D, T>( fn summaries_for_anchor_ranges<D, I>(
&self, &self,
map: &'a AnchorRangeMap<T>, version: clock::Global,
) -> impl Iterator<Item = (Range<D>, &'a T)> start_bias: Bias,
end_bias: Bias,
ranges: I,
) -> impl 'a + Iterator<Item = Range<D>>
where where
D: TextDimension<'a>, D: 'a + TextDimension<'a>,
I: 'a + IntoIterator<Item = &'a Range<FullOffset>>,
{ {
let cx = Some(map.version.clone()); let cx = Some(version);
let mut summary = D::default(); let mut summary = D::default();
let mut rope_cursor = self.visible_text.cursor(0); let mut rope_cursor = self.visible_text.cursor(0);
let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>(); let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>();
map.entries.iter().map(move |(range, value)| { ranges.into_iter().map(move |range| {
cursor.seek_forward( cursor.seek_forward(&VersionedFullOffset::Offset(range.start), start_bias, &cx);
&VersionedFullOffset::Offset(range.start),
map.start_bias,
&cx,
);
let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) {
range.start - cursor.start().0.full_offset() range.start - cursor.start().0.full_offset()
} else { } else {
@ -1831,7 +1837,7 @@ impl<'a> Content<'a> {
summary.add_assign(&rope_cursor.summary::<D>(cursor.start().1 + overshoot)); summary.add_assign(&rope_cursor.summary::<D>(cursor.start().1 + overshoot));
let start_summary = summary.clone(); let start_summary = summary.clone();
cursor.seek_forward(&VersionedFullOffset::Offset(range.end), map.end_bias, &cx); cursor.seek_forward(&VersionedFullOffset::Offset(range.end), end_bias, &cx);
let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) {
range.end - cursor.start().0.full_offset() range.end - cursor.start().0.full_offset()
} else { } else {
@ -1840,7 +1846,7 @@ impl<'a> Content<'a> {
summary.add_assign(&rope_cursor.summary::<D>(cursor.start().1 + overshoot)); summary.add_assign(&rope_cursor.summary::<D>(cursor.start().1 + overshoot));
let end_summary = summary.clone(); let end_summary = summary.clone();
(start_summary..end_summary, value) start_summary..end_summary
}) })
} }