#[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use crate::operation_transformation::Operation; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub struct OrderedOperation where T: PartialEq + Clone + std::fmt::Debug, { pub order: usize, pub operation: Operation, } impl OrderedOperation where T: PartialEq + Clone + std::fmt::Debug, { pub fn get_sort_key(&self) -> (usize, usize, String) { ( self.order, self.operation.start_index(), // Make sure that the ordering is deterministic regardless of which text // is left or right. match &self.operation { Operation::Equal { index, .. } => index.to_string(), Operation::Insert { text, .. } => text .iter() .map(crate::tokenizer::token::Token::original) .collect::(), Operation::Delete { deleted_character_count, .. } => deleted_character_count.to_string(), }, ) } } impl PartialOrd for OrderedOperation where T: PartialEq + Clone + std::fmt::Debug, { fn partial_cmp(&self, other: &Self) -> Option { self.get_sort_key().partial_cmp(&other.get_sort_key()) } }