diff --git a/backend/reconcile/src/lib.rs b/backend/reconcile/src/lib.rs index 8023cc15..a04ae853 100644 --- a/backend/reconcile/src/lib.rs +++ b/backend/reconcile/src/lib.rs @@ -1,11 +1,10 @@ -mod cursor; mod diffs; mod operation_transformation; mod tokenizer; mod utils; -pub use cursor::{CursorPosition, TextWithCursors}; pub use operation_transformation::{ - EditedText, reconcile, reconcile_with_cursors, reconcile_with_tokenizer, + CursorPosition, EditedText, TextWithCursors, reconcile, reconcile_with_cursors, + reconcile_with_tokenizer, }; pub use tokenizer::{Tokenizer, token::Token}; diff --git a/backend/reconcile/src/cursor.rs b/backend/reconcile/src/operation_transformation/cursor.rs similarity index 67% rename from backend/reconcile/src/cursor.rs rename to backend/reconcile/src/operation_transformation/cursor.rs index 7ec9402c..60abff22 100644 --- a/backend/reconcile/src/cursor.rs +++ b/backend/reconcile/src/operation_transformation/cursor.rs @@ -3,6 +3,9 @@ use std::borrow::Cow; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; +use super::merge_context::MergeContext; +use crate::operation_transformation::Operation; + // CursorPosition is a wrapper around usize to represent the position of an // identifiable cursor in a text document based on the character index. #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] @@ -12,6 +15,23 @@ pub struct CursorPosition { pub char_index: usize, } +impl CursorPosition { + pub fn apply_merge_context(&self, context: &MergeContext) -> Self + where + T: PartialEq + Clone + std::fmt::Debug, + { + let char_index = match context.last_operation() { + Some(Operation::Delete { index, .. }) => (*index) as i64, + _ => self.char_index as i64 + context.shift, + }; + + CursorPosition { + id: self.id, + char_index: char_index.max(0) as usize, + } + } +} + #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq, Default)] pub struct TextWithCursors<'a> {