diff --git a/libs/persistent_range_query/src/lib.rs b/libs/persistent_range_query/src/lib.rs index 64c9634215..48d4f28f15 100644 --- a/libs/persistent_range_query/src/lib.rs +++ b/libs/persistent_range_query/src/lib.rs @@ -6,7 +6,9 @@ pub mod ops; /// Should be a monoid: /// * Identity element: for all a: combine(new_for_empty_range(), a) = combine(a, new_for_empty_range()) = a /// * Associativity: for all a, b, c: combine(combine(a, b), c) == combine(a, combine(b, c)) -pub trait RangeQueryResult: Sized { +pub trait RangeQueryResult: Sized + Clone { + // Clone is equivalent to combine with an empty range. + fn new_for_empty_range() -> Self; // Contract: left_range.end == right_range.start diff --git a/libs/persistent_range_query/src/naive.rs b/libs/persistent_range_query/src/naive.rs index a89622687c..2e8d7d23ea 100644 --- a/libs/persistent_range_query/src/naive.rs +++ b/libs/persistent_range_query/src/naive.rs @@ -75,8 +75,6 @@ impl< Initializer: LazyRangeInitializer, Key: IndexableKey, > VecReadableVersion for NaiveVecStorage -where - Modification::Result: Clone, { fn get(&self, keys: Range) -> Modification::Result { get::(&self.all_keys, &self.last_version, keys) @@ -89,8 +87,6 @@ impl< Key: IndexableKey, > PersistentVecStorage for NaiveVecStorage -where - Modification::Result: Clone, { fn new(all_keys: Range, initializer: Initializer) -> Self { let mut values = Vec::with_capacity(IndexableKey::index(&all_keys, &all_keys.end)); diff --git a/libs/persistent_range_query/src/ops/rsq.rs b/libs/persistent_range_query/src/ops/rsq.rs index 8158d8fe03..a3d6eace93 100644 --- a/libs/persistent_range_query/src/ops/rsq.rs +++ b/libs/persistent_range_query/src/ops/rsq.rs @@ -18,7 +18,7 @@ impl SumResult { } } -impl AddAssign<&'a T> + From, Key> RangeQueryResult for SumResult +impl AddAssign<&'a T> + From, Key> RangeQueryResult for SumResult where for<'a> &'a T: Add<&'a T, Output = T>, {