This commit is contained in:
Andras Schmelczer 2025-04-01 20:53:38 +01:00
commit 23c288b1eb
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C

View file

@ -2,7 +2,7 @@ use core::fmt::Debug;
use crate::operation_transformation::Operation; use crate::operation_transformation::Operation;
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct MergeContext<T> pub struct MergeContext<T>
where where
T: PartialEq + Clone + std::fmt::Debug, T: PartialEq + Clone + std::fmt::Debug,
@ -23,26 +23,19 @@ where
} }
} }
impl<T> Debug for MergeContext<T>
where
T: PartialEq + Clone + std::fmt::Debug,
{
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("MergeContext")
.field("last_operation", &self.last_operation)
.field("shift", &self.shift)
.finish()
}
}
impl<T> MergeContext<T> impl<T> MergeContext<T>
where where
T: PartialEq + Clone + std::fmt::Debug, T: PartialEq + Clone + std::fmt::Debug,
{ {
pub fn last_operation(&self) -> Option<&Operation<T>> { self.last_operation.as_ref() } pub fn last_operation(&self) -> Option<&Operation<T>> { self.last_operation.as_ref() }
pub fn replace_last_operation(&mut self, operation: Option<Operation<T>>) {
self.last_operation = operation;
}
/// Replace the last delete operation (if there was one) with a new one /// Replace the last delete operation (if there was one) with a new one
/// while applying it to the shift. /// while applying it to the `shift` in case the last operation
/// was a delete.
pub fn consume_and_replace_last_operation(&mut self, operation: Option<Operation<T>>) { pub fn consume_and_replace_last_operation(&mut self, operation: Option<Operation<T>>) {
if let Some(Operation::Delete { if let Some(Operation::Delete {
deleted_character_count, deleted_character_count,
@ -55,32 +48,22 @@ where
self.last_operation = operation; self.last_operation = operation;
} }
pub fn replace_last_operation(&mut self, operation: Option<Operation<T>>) {
self.last_operation = operation;
}
/// Remove the last operation (if there was one) in case it is behind the /// Remove the last operation (if there was one) in case it is behind the
/// threshold operation. This changes the shift in case the last operation /// threshold operation. This updates the `shift` in case the last operation
/// was a delete. /// was a delete.
pub fn consume_last_operation_if_it_is_too_behind( pub fn consume_last_operation_if_it_is_too_behind(&mut self, threshold_index: i64) {
&mut self,
threshold_operation: &Operation<T>,
) {
if let Some(last_operation) = self.last_operation.as_ref() { if let Some(last_operation) = self.last_operation.as_ref() {
if let Operation::Delete { if let Operation::Delete {
deleted_character_count, deleted_character_count,
.. ..
} = last_operation } = last_operation
{ {
if threshold_operation.start_index() as i64 + self.shift if threshold_index + self.shift > last_operation.end_index() as i64 {
> last_operation.end_index() as i64
{
self.shift -= *deleted_character_count as i64; self.shift -= *deleted_character_count as i64;
self.last_operation = None; self.last_operation = None;
} }
} else if let Operation::Insert { .. } = last_operation { } else if let Operation::Insert { .. } = last_operation {
if threshold_operation.start_index() as i64 + self.shift if threshold_index + self.shift - last_operation.len() as i64
- last_operation.len() as i64
> last_operation.end_index() as i64 > last_operation.end_index() as i64
{ {
self.last_operation = None; self.last_operation = None;