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}