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