Introduce Content::anchor_range_multimap

This commit is contained in:
Antonio Scandurra 2021-10-26 14:27:19 +02:00
parent 5dc47c625e
commit e8a2885721
6 changed files with 115 additions and 50 deletions

View file

@ -184,9 +184,9 @@ where
self.next_internal(|_| true, cx)
}
fn next_internal<F>(&mut self, filter_node: F, cx: &<T::Summary as Summary>::Context)
fn next_internal<F>(&mut self, mut filter_node: F, cx: &<T::Summary as Summary>::Context)
where
F: Fn(&T::Summary) -> bool,
F: FnMut(&T::Summary) -> bool,
{
let mut descend = false;
@ -509,24 +509,24 @@ where
}
}
pub struct FilterCursor<'a, F: Fn(&T::Summary) -> bool, T: Item, D> {
pub struct FilterCursor<'a, F: FnMut(&T::Summary) -> bool, T: Item, D> {
cursor: Cursor<'a, T, D>,
filter_node: F,
}
impl<'a, F, T, D> FilterCursor<'a, F, T, D>
where
F: Fn(&T::Summary) -> bool,
F: FnMut(&T::Summary) -> bool,
T: Item,
D: Dimension<'a, T::Summary>,
{
pub fn new(
tree: &'a SumTree<T>,
filter_node: F,
mut filter_node: F,
cx: &<T::Summary as Summary>::Context,
) -> Self {
let mut cursor = tree.cursor::<D>();
cursor.next_internal(&filter_node, cx);
cursor.next_internal(&mut filter_node, cx);
Self {
cursor,
filter_node,
@ -542,7 +542,7 @@ where
}
pub fn next(&mut self, cx: &<T::Summary as Summary>::Context) {
self.cursor.next_internal(&self.filter_node, cx);
self.cursor.next_internal(&mut self.filter_node, cx);
}
}

View file

@ -163,7 +163,7 @@ impl<T: Item> SumTree<T> {
cx: &<T::Summary as Summary>::Context,
) -> FilterCursor<F, T, U>
where
F: Fn(&T::Summary) -> bool,
F: FnMut(&T::Summary) -> bool,
U: Dimension<'a, T::Summary>,
{
FilterCursor::new(self, filter_node, cx)