Add apply_merge_context to cursor

This commit is contained in:
Andras Schmelczer 2025-04-01 22:41:04 +01:00
parent 998ee387d2
commit 3744b0a633
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C
2 changed files with 22 additions and 3 deletions

View file

@ -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};

View file

@ -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<T>(&self, context: &MergeContext<T>) -> 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> {