mod.rs

  1mod cursor;
  2
  3use arrayvec::ArrayVec;
  4pub use cursor::Cursor;
  5pub use cursor::FilterCursor;
  6use std::{fmt, iter::FromIterator, ops::AddAssign, sync::Arc};
  7
  8#[cfg(test)]
  9const TREE_BASE: usize = 2;
 10#[cfg(not(test))]
 11const TREE_BASE: usize = 6;
 12
 13pub trait Item: Clone + Eq + fmt::Debug {
 14    type Summary: for<'a> AddAssign<&'a Self::Summary> + Default + Clone + fmt::Debug;
 15
 16    fn summary(&self) -> Self::Summary;
 17}
 18
 19pub trait KeyedItem: Item {
 20    type Key: for<'a> Dimension<'a, Self::Summary> + Ord;
 21
 22    fn key(&self) -> Self::Key;
 23}
 24
 25pub trait Dimension<'a, Summary: Default>: 'a + Clone + fmt::Debug + Default {
 26    fn add_summary(&mut self, summary: &'a Summary);
 27}
 28
 29impl<'a, T: Default> Dimension<'a, T> for () {
 30    fn add_summary(&mut self, _: &'a T) {}
 31}
 32
 33#[derive(Copy, Clone, Eq, PartialEq)]
 34pub enum SeekBias {
 35    Left,
 36    Right,
 37}
 38
 39#[derive(Debug, Clone)]
 40pub struct SumTree<T: Item>(Arc<Node<T>>);
 41
 42impl<T: Item> SumTree<T> {
 43    pub fn new() -> Self {
 44        SumTree(Arc::new(Node::Leaf {
 45            summary: T::Summary::default(),
 46            items: ArrayVec::new(),
 47            item_summaries: ArrayVec::new(),
 48        }))
 49    }
 50
 51    pub fn from_item(item: T) -> Self {
 52        let mut tree = Self::new();
 53        tree.push(item);
 54        tree
 55    }
 56
 57    pub fn items(&self) -> Vec<T> {
 58        let mut cursor = self.cursor::<(), ()>();
 59        cursor.descend_to_first_item(self, |_| true);
 60        cursor.cloned().collect()
 61    }
 62
 63    pub fn cursor<'a, S, U>(&'a self) -> Cursor<T, S, U>
 64    where
 65        S: Dimension<'a, T::Summary>,
 66        U: Dimension<'a, T::Summary>,
 67    {
 68        Cursor::new(self)
 69    }
 70
 71    pub fn filter<'a, F, U>(&'a self, filter_node: F) -> FilterCursor<F, T, U>
 72    where
 73        F: Fn(&T::Summary) -> bool,
 74        U: Dimension<'a, T::Summary>,
 75    {
 76        FilterCursor::new(self, filter_node)
 77    }
 78
 79    #[allow(dead_code)]
 80    pub fn first(&self) -> Option<&T> {
 81        self.leftmost_leaf().0.items().first()
 82    }
 83
 84    pub fn last(&self) -> Option<&T> {
 85        self.rightmost_leaf().0.items().last()
 86    }
 87
 88    pub fn extent<'a, D: Dimension<'a, T::Summary>>(&'a self) -> D {
 89        let mut extent = D::default();
 90        match self.0.as_ref() {
 91            Node::Internal { summary, .. } | Node::Leaf { summary, .. } => {
 92                extent.add_summary(summary)
 93            }
 94        }
 95        extent
 96    }
 97
 98    pub fn summary(&self) -> T::Summary {
 99        match self.0.as_ref() {
100            Node::Internal { summary, .. } => summary.clone(),
101            Node::Leaf { summary, .. } => summary.clone(),
102        }
103    }
104
105    pub fn is_empty(&self) -> bool {
106        match self.0.as_ref() {
107            Node::Internal { .. } => false,
108            Node::Leaf { items, .. } => items.is_empty(),
109        }
110    }
111
112    pub fn extend<I>(&mut self, iter: I)
113    where
114        I: IntoIterator<Item = T>,
115    {
116        let mut leaf: Option<Node<T>> = None;
117
118        for item in iter {
119            if leaf.is_some() && leaf.as_ref().unwrap().items().len() == 2 * TREE_BASE {
120                self.push_tree(SumTree(Arc::new(leaf.take().unwrap())));
121            }
122
123            if leaf.is_none() {
124                leaf = Some(Node::Leaf::<T> {
125                    summary: T::Summary::default(),
126                    items: ArrayVec::new(),
127                    item_summaries: ArrayVec::new(),
128                });
129            }
130
131            if let Some(Node::Leaf {
132                summary,
133                items,
134                item_summaries,
135            }) = leaf.as_mut()
136            {
137                let item_summary = item.summary();
138                *summary += &item_summary;
139                items.push(item);
140                item_summaries.push(item_summary);
141            } else {
142                unreachable!()
143            }
144        }
145
146        if leaf.is_some() {
147            self.push_tree(SumTree(Arc::new(leaf.take().unwrap())));
148        }
149    }
150
151    pub fn push(&mut self, item: T) {
152        let summary = item.summary();
153        self.push_tree(SumTree::from_child_trees(vec![SumTree(Arc::new(
154            Node::Leaf {
155                summary: summary.clone(),
156                items: ArrayVec::from_iter(Some(item)),
157                item_summaries: ArrayVec::from_iter(Some(summary)),
158            },
159        ))]))
160    }
161
162    pub fn push_tree(&mut self, other: Self) {
163        let other_node = other.0.clone();
164        if !other_node.is_leaf() || other_node.items().len() > 0 {
165            if self.0.height() < other_node.height() {
166                for tree in other_node.child_trees() {
167                    self.push_tree(tree.clone());
168                }
169            } else if let Some(split_tree) = self.push_tree_recursive(other) {
170                *self = Self::from_child_trees(vec![self.clone(), split_tree]);
171            }
172        }
173    }
174
175    fn push_tree_recursive(&mut self, other: SumTree<T>) -> Option<SumTree<T>> {
176        match Arc::make_mut(&mut self.0) {
177            Node::Internal {
178                height,
179                summary,
180                child_summaries,
181                child_trees,
182                ..
183            } => {
184                let other_node = other.0.clone();
185                *summary += other_node.summary();
186
187                let height_delta = *height - other_node.height();
188                let mut summaries_to_append = ArrayVec::<[T::Summary; 2 * TREE_BASE]>::new();
189                let mut trees_to_append = ArrayVec::<[SumTree<T>; 2 * TREE_BASE]>::new();
190                if height_delta == 0 {
191                    summaries_to_append.extend(other_node.child_summaries().iter().cloned());
192                    trees_to_append.extend(other_node.child_trees().iter().cloned());
193                } else if height_delta == 1 && !other_node.is_underflowing() {
194                    summaries_to_append.push(other_node.summary().clone());
195                    trees_to_append.push(other)
196                } else {
197                    let tree_to_append = child_trees.last_mut().unwrap().push_tree_recursive(other);
198                    *child_summaries.last_mut().unwrap() =
199                        child_trees.last().unwrap().0.summary().clone();
200
201                    if let Some(split_tree) = tree_to_append {
202                        summaries_to_append.push(split_tree.0.summary().clone());
203                        trees_to_append.push(split_tree);
204                    }
205                }
206
207                let child_count = child_trees.len() + trees_to_append.len();
208                if child_count > 2 * TREE_BASE {
209                    let left_summaries: ArrayVec<_>;
210                    let right_summaries: ArrayVec<_>;
211                    let left_trees;
212                    let right_trees;
213
214                    let midpoint = (child_count + child_count % 2) / 2;
215                    {
216                        let mut all_summaries = child_summaries
217                            .iter()
218                            .chain(summaries_to_append.iter())
219                            .cloned();
220                        left_summaries = all_summaries.by_ref().take(midpoint).collect();
221                        right_summaries = all_summaries.collect();
222                        let mut all_trees =
223                            child_trees.iter().chain(trees_to_append.iter()).cloned();
224                        left_trees = all_trees.by_ref().take(midpoint).collect();
225                        right_trees = all_trees.collect();
226                    }
227                    *summary = sum(left_summaries.iter());
228                    *child_summaries = left_summaries;
229                    *child_trees = left_trees;
230
231                    Some(SumTree(Arc::new(Node::Internal {
232                        height: *height,
233                        summary: sum(right_summaries.iter()),
234                        child_summaries: right_summaries,
235                        child_trees: right_trees,
236                    })))
237                } else {
238                    child_summaries.extend(summaries_to_append);
239                    child_trees.extend(trees_to_append);
240                    None
241                }
242            }
243            Node::Leaf {
244                summary,
245                items,
246                item_summaries,
247            } => {
248                let other_node = other.0;
249
250                let child_count = items.len() + other_node.items().len();
251                if child_count > 2 * TREE_BASE {
252                    let left_items;
253                    let right_items;
254                    let left_summaries;
255                    let right_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>;
256
257                    let midpoint = (child_count + child_count % 2) / 2;
258                    {
259                        let mut all_items = items.iter().chain(other_node.items().iter()).cloned();
260                        left_items = all_items.by_ref().take(midpoint).collect();
261                        right_items = all_items.collect();
262
263                        let mut all_summaries = item_summaries
264                            .iter()
265                            .chain(other_node.child_summaries())
266                            .cloned();
267                        left_summaries = all_summaries.by_ref().take(midpoint).collect();
268                        right_summaries = all_summaries.collect();
269                    }
270                    *items = left_items;
271                    *item_summaries = left_summaries;
272                    *summary = sum(item_summaries.iter());
273                    Some(SumTree(Arc::new(Node::Leaf {
274                        items: right_items,
275                        summary: sum(right_summaries.iter()),
276                        item_summaries: right_summaries,
277                    })))
278                } else {
279                    *summary += other_node.summary();
280                    items.extend(other_node.items().iter().cloned());
281                    item_summaries.extend(other_node.child_summaries().iter().cloned());
282                    None
283                }
284            }
285        }
286    }
287
288    fn from_child_trees(child_trees: Vec<SumTree<T>>) -> Self {
289        let height = child_trees[0].0.height() + 1;
290        let mut child_summaries = ArrayVec::new();
291        for child in &child_trees {
292            child_summaries.push(child.0.summary().clone());
293        }
294        let summary = sum(child_summaries.iter());
295        SumTree(Arc::new(Node::Internal {
296            height,
297            summary,
298            child_summaries,
299            child_trees: ArrayVec::from_iter(child_trees),
300        }))
301    }
302
303    fn leftmost_leaf(&self) -> &Self {
304        match *self.0 {
305            Node::Leaf { .. } => self,
306            Node::Internal {
307                ref child_trees, ..
308            } => child_trees.first().unwrap().leftmost_leaf(),
309        }
310    }
311
312    fn rightmost_leaf(&self) -> &Self {
313        match *self.0 {
314            Node::Leaf { .. } => self,
315            Node::Internal {
316                ref child_trees, ..
317            } => child_trees.last().unwrap().rightmost_leaf(),
318        }
319    }
320}
321
322impl<T: KeyedItem> SumTree<T> {
323    pub fn insert(&mut self, item: T) {
324        *self = {
325            let mut cursor = self.cursor::<T::Key, ()>();
326            let mut new_tree = cursor.slice(&item.key(), SeekBias::Left);
327            new_tree.push(item);
328            new_tree.push_tree(cursor.suffix());
329            new_tree
330        };
331    }
332
333    pub fn edit(&mut self, edits: &mut [Edit<T>]) {
334        if edits.is_empty() {
335            return;
336        }
337
338        edits.sort_unstable_by_key(|item| item.key());
339
340        *self = {
341            let mut cursor = self.cursor::<T::Key, ()>();
342            let mut new_tree = SumTree::new();
343            let mut buffered_items = Vec::new();
344
345            cursor.seek(&T::Key::default(), SeekBias::Left);
346            for edit in edits {
347                let new_key = edit.key();
348                let mut old_item = cursor.item();
349
350                if old_item
351                    .as_ref()
352                    .map_or(false, |old_item| old_item.key() < new_key)
353                {
354                    new_tree.extend(buffered_items.drain(..));
355                    let slice = cursor.slice(&new_key, SeekBias::Left);
356                    new_tree.push_tree(slice);
357                    old_item = cursor.item();
358                }
359                if old_item.map_or(false, |old_item| old_item.key() == new_key) {
360                    cursor.next();
361                }
362                match edit {
363                    Edit::Insert(item) => {
364                        buffered_items.push(item.clone());
365                    }
366                    Edit::Remove(_) => {}
367                }
368            }
369
370            new_tree.extend(buffered_items);
371            new_tree.push_tree(cursor.suffix());
372            new_tree
373        };
374    }
375}
376
377#[derive(Clone, Debug)]
378pub enum Node<T: Item> {
379    Internal {
380        height: u8,
381        summary: T::Summary,
382        child_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>,
383        child_trees: ArrayVec<[SumTree<T>; 2 * TREE_BASE]>,
384    },
385    Leaf {
386        summary: T::Summary,
387        items: ArrayVec<[T; 2 * TREE_BASE]>,
388        item_summaries: ArrayVec<[T::Summary; 2 * TREE_BASE]>,
389    },
390}
391
392impl<T: Item> Node<T> {
393    fn is_leaf(&self) -> bool {
394        match self {
395            Node::Leaf { .. } => true,
396            _ => false,
397        }
398    }
399
400    fn height(&self) -> u8 {
401        match self {
402            Node::Internal { height, .. } => *height,
403            Node::Leaf { .. } => 0,
404        }
405    }
406
407    fn summary(&self) -> &T::Summary {
408        match self {
409            Node::Internal { summary, .. } => summary,
410            Node::Leaf { summary, .. } => summary,
411        }
412    }
413
414    fn child_summaries(&self) -> &[T::Summary] {
415        match self {
416            Node::Internal {
417                child_summaries, ..
418            } => child_summaries.as_slice(),
419            Node::Leaf { item_summaries, .. } => item_summaries.as_slice(),
420        }
421    }
422
423    fn child_trees(&self) -> &ArrayVec<[SumTree<T>; 2 * TREE_BASE]> {
424        match self {
425            Node::Internal { child_trees, .. } => child_trees,
426            Node::Leaf { .. } => panic!("Leaf nodes have no child trees"),
427        }
428    }
429
430    fn items(&self) -> &ArrayVec<[T; 2 * TREE_BASE]> {
431        match self {
432            Node::Leaf { items, .. } => items,
433            Node::Internal { .. } => panic!("Internal nodes have no items"),
434        }
435    }
436
437    fn is_underflowing(&self) -> bool {
438        match self {
439            Node::Internal { child_trees, .. } => child_trees.len() < TREE_BASE,
440            Node::Leaf { items, .. } => items.len() < TREE_BASE,
441        }
442    }
443}
444
445#[derive(Debug)]
446pub enum Edit<T: KeyedItem> {
447    Insert(T),
448    Remove(T),
449}
450
451impl<T: KeyedItem> Edit<T> {
452    fn key(&self) -> T::Key {
453        match self {
454            Edit::Insert(item) | Edit::Remove(item) => item.key(),
455        }
456    }
457}
458
459fn sum<'a, T, I>(iter: I) -> T
460where
461    T: 'a + Default + AddAssign<&'a T>,
462    I: Iterator<Item = &'a T>,
463{
464    let mut sum = T::default();
465    for value in iter {
466        sum += value;
467    }
468    sum
469}
470
471#[cfg(test)]
472mod tests {
473    use super::*;
474    use std::ops::Add;
475
476    #[test]
477    fn test_extend_and_push_tree() {
478        let mut tree1 = SumTree::new();
479        tree1.extend(0..20);
480
481        let mut tree2 = SumTree::new();
482        tree2.extend(50..100);
483
484        tree1.push_tree(tree2);
485        assert_eq!(tree1.items(), (0..20).chain(50..100).collect::<Vec<u8>>());
486    }
487
488    #[test]
489    fn test_random() {
490        for seed in 0..100 {
491            use rand::{distributions, prelude::*};
492
493            let rng = &mut StdRng::seed_from_u64(seed);
494
495            let mut tree = SumTree::<u8>::new();
496            let count = rng.gen_range(0..10);
497            tree.extend(rng.sample_iter(distributions::Standard).take(count));
498
499            for _ in 0..5 {
500                let splice_end = rng.gen_range(0..tree.extent::<Count>().0 + 1);
501                let splice_start = rng.gen_range(0..splice_end + 1);
502                let count = rng.gen_range(0..3);
503                let tree_end = tree.extent::<Count>();
504                let new_items = rng
505                    .sample_iter(distributions::Standard)
506                    .take(count)
507                    .collect::<Vec<u8>>();
508
509                let mut reference_items = tree.items();
510                reference_items.splice(splice_start..splice_end, new_items.clone());
511
512                tree = {
513                    let mut cursor = tree.cursor::<Count, ()>();
514                    let mut new_tree = cursor.slice(&Count(splice_start), SeekBias::Right);
515                    new_tree.extend(new_items);
516                    cursor.seek(&Count(splice_end), SeekBias::Right);
517                    new_tree.push_tree(cursor.slice(&tree_end, SeekBias::Right));
518                    new_tree
519                };
520
521                assert_eq!(tree.items(), reference_items);
522
523                let mut filter_cursor = tree.filter::<_, Count>(|summary| summary.contains_even);
524                let mut reference_filter = tree
525                    .items()
526                    .into_iter()
527                    .enumerate()
528                    .filter(|(_, item)| (item & 1) == 0);
529                while let Some(actual_item) = filter_cursor.item() {
530                    let (reference_index, reference_item) = reference_filter.next().unwrap();
531                    assert_eq!(actual_item, &reference_item);
532                    assert_eq!(filter_cursor.start().0, reference_index);
533                    filter_cursor.next();
534                }
535                assert!(reference_filter.next().is_none());
536
537                let mut pos = rng.gen_range(0..tree.extent::<Count>().0 + 1);
538                let mut before_start = false;
539                let mut cursor = tree.cursor::<Count, Count>();
540                cursor.seek(&Count(pos), SeekBias::Right);
541
542                for i in 0..10 {
543                    assert_eq!(cursor.start().0, pos);
544
545                    if pos > 0 {
546                        assert_eq!(cursor.prev_item().unwrap(), &reference_items[pos - 1]);
547                    } else {
548                        assert_eq!(cursor.prev_item(), None);
549                    }
550
551                    if pos < reference_items.len() && !before_start {
552                        assert_eq!(cursor.item().unwrap(), &reference_items[pos]);
553                    } else {
554                        assert_eq!(cursor.item(), None);
555                    }
556
557                    if i < 5 {
558                        cursor.next();
559                        if pos < reference_items.len() {
560                            pos += 1;
561                            before_start = false;
562                        }
563                    } else {
564                        cursor.prev();
565                        if pos == 0 {
566                            before_start = true;
567                        }
568                        pos = pos.saturating_sub(1);
569                    }
570                }
571            }
572
573            for _ in 0..10 {
574                let end = rng.gen_range(0..tree.extent::<Count>().0 + 1);
575                let start = rng.gen_range(0..end + 1);
576                let start_bias = if rng.gen() {
577                    SeekBias::Left
578                } else {
579                    SeekBias::Right
580                };
581                let end_bias = if rng.gen() {
582                    SeekBias::Left
583                } else {
584                    SeekBias::Right
585                };
586
587                let mut cursor = tree.cursor::<Count, ()>();
588                cursor.seek(&Count(start), start_bias);
589                let slice = cursor.slice(&Count(end), end_bias);
590
591                cursor.seek(&Count(start), start_bias);
592                let summary = cursor.summary::<Sum>(&Count(end), end_bias);
593
594                assert_eq!(summary, slice.summary().sum);
595            }
596        }
597    }
598
599    #[test]
600    fn test_cursor() {
601        // Empty tree
602        let tree = SumTree::<u8>::new();
603        let mut cursor = tree.cursor::<Count, Sum>();
604        assert_eq!(
605            cursor.slice(&Count(0), SeekBias::Right).items(),
606            Vec::<u8>::new()
607        );
608        assert_eq!(cursor.item(), None);
609        assert_eq!(cursor.prev_item(), None);
610        assert_eq!(cursor.start(), &Sum(0));
611
612        // Single-element tree
613        let mut tree = SumTree::<u8>::new();
614        tree.extend(vec![1]);
615        let mut cursor = tree.cursor::<Count, Sum>();
616        assert_eq!(
617            cursor.slice(&Count(0), SeekBias::Right).items(),
618            Vec::<u8>::new()
619        );
620        assert_eq!(cursor.item(), Some(&1));
621        assert_eq!(cursor.prev_item(), None);
622        assert_eq!(cursor.start(), &Sum(0));
623
624        cursor.next();
625        assert_eq!(cursor.item(), None);
626        assert_eq!(cursor.prev_item(), Some(&1));
627        assert_eq!(cursor.start(), &Sum(1));
628
629        cursor.prev();
630        assert_eq!(cursor.item(), Some(&1));
631        assert_eq!(cursor.prev_item(), None);
632        assert_eq!(cursor.start(), &Sum(0));
633
634        let mut cursor = tree.cursor::<Count, Sum>();
635        assert_eq!(cursor.slice(&Count(1), SeekBias::Right).items(), [1]);
636        assert_eq!(cursor.item(), None);
637        assert_eq!(cursor.prev_item(), Some(&1));
638        assert_eq!(cursor.start(), &Sum(1));
639
640        cursor.seek(&Count(0), SeekBias::Right);
641        assert_eq!(
642            cursor
643                .slice(&tree.extent::<Count>(), SeekBias::Right)
644                .items(),
645            [1]
646        );
647        assert_eq!(cursor.item(), None);
648        assert_eq!(cursor.prev_item(), Some(&1));
649        assert_eq!(cursor.start(), &Sum(1));
650
651        // Multiple-element tree
652        let mut tree = SumTree::new();
653        tree.extend(vec![1, 2, 3, 4, 5, 6]);
654        let mut cursor = tree.cursor::<Count, Sum>();
655
656        assert_eq!(cursor.slice(&Count(2), SeekBias::Right).items(), [1, 2]);
657        assert_eq!(cursor.item(), Some(&3));
658        assert_eq!(cursor.prev_item(), Some(&2));
659        assert_eq!(cursor.start(), &Sum(3));
660
661        cursor.next();
662        assert_eq!(cursor.item(), Some(&4));
663        assert_eq!(cursor.prev_item(), Some(&3));
664        assert_eq!(cursor.start(), &Sum(6));
665
666        cursor.next();
667        assert_eq!(cursor.item(), Some(&5));
668        assert_eq!(cursor.prev_item(), Some(&4));
669        assert_eq!(cursor.start(), &Sum(10));
670
671        cursor.next();
672        assert_eq!(cursor.item(), Some(&6));
673        assert_eq!(cursor.prev_item(), Some(&5));
674        assert_eq!(cursor.start(), &Sum(15));
675
676        cursor.next();
677        cursor.next();
678        assert_eq!(cursor.item(), None);
679        assert_eq!(cursor.prev_item(), Some(&6));
680        assert_eq!(cursor.start(), &Sum(21));
681
682        cursor.prev();
683        assert_eq!(cursor.item(), Some(&6));
684        assert_eq!(cursor.prev_item(), Some(&5));
685        assert_eq!(cursor.start(), &Sum(15));
686
687        cursor.prev();
688        assert_eq!(cursor.item(), Some(&5));
689        assert_eq!(cursor.prev_item(), Some(&4));
690        assert_eq!(cursor.start(), &Sum(10));
691
692        cursor.prev();
693        assert_eq!(cursor.item(), Some(&4));
694        assert_eq!(cursor.prev_item(), Some(&3));
695        assert_eq!(cursor.start(), &Sum(6));
696
697        cursor.prev();
698        assert_eq!(cursor.item(), Some(&3));
699        assert_eq!(cursor.prev_item(), Some(&2));
700        assert_eq!(cursor.start(), &Sum(3));
701
702        cursor.prev();
703        assert_eq!(cursor.item(), Some(&2));
704        assert_eq!(cursor.prev_item(), Some(&1));
705        assert_eq!(cursor.start(), &Sum(1));
706
707        cursor.prev();
708        assert_eq!(cursor.item(), Some(&1));
709        assert_eq!(cursor.prev_item(), None);
710        assert_eq!(cursor.start(), &Sum(0));
711
712        cursor.prev();
713        assert_eq!(cursor.item(), None);
714        assert_eq!(cursor.prev_item(), None);
715        assert_eq!(cursor.start(), &Sum(0));
716
717        cursor.next();
718        assert_eq!(cursor.item(), Some(&1));
719        assert_eq!(cursor.prev_item(), None);
720        assert_eq!(cursor.start(), &Sum(0));
721
722        let mut cursor = tree.cursor::<Count, Sum>();
723        assert_eq!(
724            cursor
725                .slice(&tree.extent::<Count>(), SeekBias::Right)
726                .items(),
727            tree.items()
728        );
729        assert_eq!(cursor.item(), None);
730        assert_eq!(cursor.prev_item(), Some(&6));
731        assert_eq!(cursor.start(), &Sum(21));
732
733        cursor.seek(&Count(3), SeekBias::Right);
734        assert_eq!(
735            cursor
736                .slice(&tree.extent::<Count>(), SeekBias::Right)
737                .items(),
738            [4, 5, 6]
739        );
740        assert_eq!(cursor.item(), None);
741        assert_eq!(cursor.prev_item(), Some(&6));
742        assert_eq!(cursor.start(), &Sum(21));
743
744        // Seeking can bias left or right
745        cursor.seek(&Count(1), SeekBias::Left);
746        assert_eq!(cursor.item(), Some(&1));
747        cursor.seek(&Count(1), SeekBias::Right);
748        assert_eq!(cursor.item(), Some(&2));
749
750        // Slicing without resetting starts from where the cursor is parked at.
751        cursor.seek(&Count(1), SeekBias::Right);
752        assert_eq!(cursor.slice(&Count(3), SeekBias::Right).items(), vec![2, 3]);
753        assert_eq!(cursor.slice(&Count(6), SeekBias::Left).items(), vec![4, 5]);
754        assert_eq!(cursor.slice(&Count(6), SeekBias::Right).items(), vec![6]);
755    }
756
757    #[derive(Clone, Default, Debug)]
758    pub struct IntegersSummary {
759        count: Count,
760        sum: Sum,
761        contains_even: bool,
762    }
763
764    #[derive(Ord, PartialOrd, Default, Eq, PartialEq, Clone, Debug)]
765    struct Count(usize);
766
767    #[derive(Ord, PartialOrd, Default, Eq, PartialEq, Clone, Debug)]
768    struct Sum(usize);
769
770    impl Item for u8 {
771        type Summary = IntegersSummary;
772
773        fn summary(&self) -> Self::Summary {
774            IntegersSummary {
775                count: Count(1),
776                sum: Sum(*self as usize),
777                contains_even: (*self & 1) == 0,
778            }
779        }
780    }
781
782    impl<'a> AddAssign<&'a Self> for IntegersSummary {
783        fn add_assign(&mut self, other: &Self) {
784            self.count.0 += &other.count.0;
785            self.sum.0 += &other.sum.0;
786            self.contains_even |= other.contains_even;
787        }
788    }
789
790    impl<'a> Dimension<'a, IntegersSummary> for Count {
791        fn add_summary(&mut self, summary: &IntegersSummary) {
792            self.0 += summary.count.0;
793        }
794    }
795
796    // impl<'a> Add<&'a Self> for Count {
797    //     type Output = Self;
798    //
799    //     fn add(mut self, other: &Self) -> Self {
800    //         self.0 += other.0;
801    //         self
802    //     }
803    // }
804
805    impl<'a> Dimension<'a, IntegersSummary> for Sum {
806        fn add_summary(&mut self, summary: &IntegersSummary) {
807            self.0 += summary.sum.0;
808        }
809    }
810
811    impl<'a> Add<&'a Self> for Sum {
812        type Output = Self;
813
814        fn add(mut self, other: &Self) -> Self {
815            self.0 += other.0;
816            self
817        }
818    }
819}