From 2f78d93383bdc329b172bc5219a9641c66444b56 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 25 Nov 2021 17:03:06 +0100 Subject: [PATCH] Make `summaries_for_anchors`/`summaries_for_anchor_ranges` more generic Co-Authored-By: Nathan Sobo --- crates/buffer/src/anchor.rs | 17 +++++++++++--- crates/buffer/src/lib.rs | 44 +++++++++++++++++++++---------------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/crates/buffer/src/anchor.rs b/crates/buffer/src/anchor.rs index 50f1d897c8d370427fc64986dde81d53e5f6e47d..50d0c2f92765e4a55c67736c8551eb9bc58398e4 100644 --- a/crates/buffer/src/anchor.rs +++ b/crates/buffer/src/anchor.rs @@ -142,8 +142,12 @@ impl AnchorMap { { let content = content.into(); content - .summaries_for_anchors(self) - .map(move |(sum, value)| (sum, value)) + .summaries_for_anchors( + 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 AnchorRangeMap { D: 'a + TextDimension<'a>, { 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, T)> { diff --git a/crates/buffer/src/lib.rs b/crates/buffer/src/lib.rs index e6fb6fb0cad1240d482fe3da1389a4f4c4f2870e..81288e7c41e0ca761664dda6a2ac261c34a11c4b 100644 --- a/crates/buffer/src/lib.rs +++ b/crates/buffer/src/lib.rs @@ -1786,43 +1786,49 @@ impl<'a> Content<'a> { self.visible_text.cursor(range.start).summary(range.end) } - fn summaries_for_anchors(&self, map: &'a AnchorMap) -> impl Iterator + fn summaries_for_anchors( + &self, + version: clock::Global, + bias: Bias, + ranges: I, + ) -> impl 'a + Iterator where - D: TextDimension<'a>, + D: 'a + TextDimension<'a>, + I: 'a + IntoIterator, { - let cx = Some(map.version.clone()); + let cx = Some(version.clone()); let mut summary = D::default(); let mut rope_cursor = self.visible_text.cursor(0); let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>(); - map.entries.iter().map(move |(offset, value)| { - cursor.seek_forward(&VersionedFullOffset::Offset(*offset), map.bias, &cx); + ranges.into_iter().map(move |offset| { + cursor.seek_forward(&VersionedFullOffset::Offset(*offset), bias, &cx); let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { *offset - cursor.start().0.full_offset() } else { 0 }; summary.add_assign(&rope_cursor.summary(cursor.start().1 + overshoot)); - (summary.clone(), value) + summary.clone() }) } - fn summaries_for_anchor_ranges( + fn summaries_for_anchor_ranges( &self, - map: &'a AnchorRangeMap, - ) -> impl Iterator, &'a T)> + version: clock::Global, + start_bias: Bias, + end_bias: Bias, + ranges: I, + ) -> impl 'a + Iterator> where - D: TextDimension<'a>, + D: 'a + TextDimension<'a>, + I: 'a + IntoIterator>, { - let cx = Some(map.version.clone()); + let cx = Some(version); let mut summary = D::default(); let mut rope_cursor = self.visible_text.cursor(0); let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>(); - map.entries.iter().map(move |(range, value)| { - cursor.seek_forward( - &VersionedFullOffset::Offset(range.start), - map.start_bias, - &cx, - ); + ranges.into_iter().map(move |range| { + cursor.seek_forward(&VersionedFullOffset::Offset(range.start), start_bias, &cx); let overshoot = if cursor.item().map_or(false, |fragment| fragment.visible) { range.start - cursor.start().0.full_offset() } else { @@ -1831,7 +1837,7 @@ impl<'a> Content<'a> { summary.add_assign(&rope_cursor.summary::(cursor.start().1 + overshoot)); 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) { range.end - cursor.start().0.full_offset() } else { @@ -1840,7 +1846,7 @@ impl<'a> Content<'a> { summary.add_assign(&rope_cursor.summary::(cursor.start().1 + overshoot)); let end_summary = summary.clone(); - (start_summary..end_summary, value) + start_summary..end_summary }) }