text.rs

   1mod anchor;
   2pub mod locator;
   3#[cfg(any(test, feature = "test-support"))]
   4pub mod network;
   5pub mod operation_queue;
   6mod patch;
   7mod point;
   8mod point_utf16;
   9#[cfg(any(test, feature = "test-support"))]
  10pub mod random_char_iter;
  11pub mod rope;
  12mod selection;
  13pub mod subscription;
  14#[cfg(test)]
  15mod tests;
  16
  17pub use anchor::*;
  18use anyhow::Result;
  19use clock::ReplicaId;
  20use collections::{HashMap, HashSet};
  21use locator::Locator;
  22use operation_queue::OperationQueue;
  23pub use patch::Patch;
  24pub use point::*;
  25pub use point_utf16::*;
  26use postage::{barrier, oneshot, prelude::*};
  27#[cfg(any(test, feature = "test-support"))]
  28pub use random_char_iter::*;
  29use rope::TextDimension;
  30pub use rope::{Chunks, Rope, TextSummary};
  31pub use selection::*;
  32use std::{
  33    cmp::{self, Ordering},
  34    future::Future,
  35    iter::Iterator,
  36    ops::{self, Deref, Range, Sub},
  37    str,
  38    sync::Arc,
  39    time::{Duration, Instant},
  40};
  41pub use subscription::*;
  42pub use sum_tree::Bias;
  43use sum_tree::{FilterCursor, SumTree};
  44
  45pub type TransactionId = clock::Local;
  46
  47pub struct Buffer {
  48    snapshot: BufferSnapshot,
  49    history: History,
  50    deferred_ops: OperationQueue<Operation>,
  51    deferred_replicas: HashSet<ReplicaId>,
  52    replica_id: ReplicaId,
  53    local_clock: clock::Local,
  54    pub lamport_clock: clock::Lamport,
  55    subscriptions: Topic,
  56    edit_id_resolvers: HashMap<clock::Local, Vec<oneshot::Sender<()>>>,
  57    version_barriers: Vec<(clock::Global, barrier::Sender)>,
  58}
  59
  60#[derive(Clone, Debug)]
  61pub struct BufferSnapshot {
  62    replica_id: ReplicaId,
  63    remote_id: u64,
  64    visible_text: Rope,
  65    deleted_text: Rope,
  66    undo_map: UndoMap,
  67    fragments: SumTree<Fragment>,
  68    insertions: SumTree<InsertionFragment>,
  69    pub version: clock::Global,
  70}
  71
  72#[derive(Clone, Debug)]
  73pub struct HistoryEntry {
  74    transaction: Transaction,
  75    first_edit_at: Instant,
  76    last_edit_at: Instant,
  77    suppress_grouping: bool,
  78}
  79
  80#[derive(Clone, Debug)]
  81pub struct Transaction {
  82    pub id: TransactionId,
  83    pub edit_ids: Vec<clock::Local>,
  84    pub start: clock::Global,
  85    pub end: clock::Global,
  86    pub ranges: Vec<Range<FullOffset>>,
  87}
  88
  89impl HistoryEntry {
  90    pub fn transaction_id(&self) -> TransactionId {
  91        self.transaction.id
  92    }
  93
  94    fn push_edit(&mut self, edit_operation: &EditOperation) {
  95        self.transaction
  96            .edit_ids
  97            .push(edit_operation.timestamp.local());
  98        self.transaction
  99            .end
 100            .observe(edit_operation.timestamp.local());
 101
 102        let mut edits = edit_operation
 103            .ranges
 104            .iter()
 105            .zip(edit_operation.new_text.iter())
 106            .peekable();
 107        let mut new_ranges = Vec::new();
 108        let mut delta = 0;
 109
 110        for mut self_range in self.transaction.ranges.iter().cloned() {
 111            self_range.start += delta;
 112            self_range.end += delta;
 113
 114            while let Some((other_range, new_text)) = edits.peek() {
 115                let insertion_len = new_text.len();
 116                let mut other_range = (*other_range).clone();
 117                other_range.start += delta;
 118                other_range.end += delta;
 119
 120                if other_range.start <= self_range.end {
 121                    edits.next().unwrap();
 122                    delta += insertion_len;
 123
 124                    if other_range.end < self_range.start {
 125                        new_ranges.push(other_range.start..other_range.end + insertion_len);
 126                        self_range.start += insertion_len;
 127                        self_range.end += insertion_len;
 128                    } else {
 129                        self_range.start = cmp::min(self_range.start, other_range.start);
 130                        self_range.end = cmp::max(self_range.end, other_range.end) + insertion_len;
 131                    }
 132                } else {
 133                    break;
 134                }
 135            }
 136
 137            new_ranges.push(self_range);
 138        }
 139
 140        for (other_range, new_text) in edits {
 141            let insertion_len = new_text.len();
 142            new_ranges.push(other_range.start + delta..other_range.end + delta + insertion_len);
 143            delta += insertion_len;
 144        }
 145
 146        self.transaction.ranges = new_ranges;
 147    }
 148}
 149
 150#[derive(Clone)]
 151pub struct History {
 152    // TODO: Turn this into a String or Rope, maybe.
 153    pub base_text: Arc<str>,
 154    operations: HashMap<clock::Local, Operation>,
 155    undo_stack: Vec<HistoryEntry>,
 156    redo_stack: Vec<HistoryEntry>,
 157    transaction_depth: usize,
 158    group_interval: Duration,
 159}
 160
 161impl History {
 162    pub fn new(base_text: Arc<str>) -> Self {
 163        Self {
 164            base_text,
 165            operations: Default::default(),
 166            undo_stack: Vec::new(),
 167            redo_stack: Vec::new(),
 168            transaction_depth: 0,
 169            group_interval: Duration::from_millis(300),
 170        }
 171    }
 172
 173    fn push(&mut self, op: Operation) {
 174        self.operations.insert(op.local_timestamp(), op);
 175    }
 176
 177    fn start_transaction(
 178        &mut self,
 179        start: clock::Global,
 180        now: Instant,
 181        local_clock: &mut clock::Local,
 182    ) -> Option<TransactionId> {
 183        self.transaction_depth += 1;
 184        if self.transaction_depth == 1 {
 185            let id = local_clock.tick();
 186            self.undo_stack.push(HistoryEntry {
 187                transaction: Transaction {
 188                    id,
 189                    start: start.clone(),
 190                    end: start,
 191                    edit_ids: Default::default(),
 192                    ranges: Default::default(),
 193                },
 194                first_edit_at: now,
 195                last_edit_at: now,
 196                suppress_grouping: false,
 197            });
 198            Some(id)
 199        } else {
 200            None
 201        }
 202    }
 203
 204    fn end_transaction(&mut self, now: Instant) -> Option<&HistoryEntry> {
 205        assert_ne!(self.transaction_depth, 0);
 206        self.transaction_depth -= 1;
 207        if self.transaction_depth == 0 {
 208            if self
 209                .undo_stack
 210                .last()
 211                .unwrap()
 212                .transaction
 213                .ranges
 214                .is_empty()
 215            {
 216                self.undo_stack.pop();
 217                None
 218            } else {
 219                self.redo_stack.clear();
 220                let entry = self.undo_stack.last_mut().unwrap();
 221                entry.last_edit_at = now;
 222                Some(entry)
 223            }
 224        } else {
 225            None
 226        }
 227    }
 228
 229    fn group(&mut self) -> Option<TransactionId> {
 230        let mut new_len = self.undo_stack.len();
 231        let mut entries = self.undo_stack.iter_mut();
 232
 233        if let Some(mut entry) = entries.next_back() {
 234            while let Some(prev_entry) = entries.next_back() {
 235                if !prev_entry.suppress_grouping
 236                    && entry.first_edit_at - prev_entry.last_edit_at <= self.group_interval
 237                    && entry.transaction.start == prev_entry.transaction.end
 238                {
 239                    entry = prev_entry;
 240                    new_len -= 1;
 241                } else {
 242                    break;
 243                }
 244            }
 245        }
 246
 247        let (entries_to_keep, entries_to_merge) = self.undo_stack.split_at_mut(new_len);
 248        if let Some(last_entry) = entries_to_keep.last_mut() {
 249            for entry in &*entries_to_merge {
 250                for edit_id in &entry.transaction.edit_ids {
 251                    last_entry.push_edit(self.operations[edit_id].as_edit().unwrap());
 252                }
 253            }
 254
 255            if let Some(entry) = entries_to_merge.last_mut() {
 256                last_entry.last_edit_at = entry.last_edit_at;
 257                last_entry.transaction.end = entry.transaction.end.clone();
 258            }
 259        }
 260
 261        self.undo_stack.truncate(new_len);
 262        self.undo_stack.last().map(|e| e.transaction.id)
 263    }
 264
 265    fn finalize_last_transaction(&mut self) -> Option<&Transaction> {
 266        self.undo_stack.last_mut().map(|entry| {
 267            entry.suppress_grouping = true;
 268            &entry.transaction
 269        })
 270    }
 271
 272    fn push_transaction(&mut self, transaction: Transaction, now: Instant) {
 273        assert_eq!(self.transaction_depth, 0);
 274        self.undo_stack.push(HistoryEntry {
 275            transaction,
 276            first_edit_at: now,
 277            last_edit_at: now,
 278            suppress_grouping: false,
 279        });
 280        self.redo_stack.clear();
 281    }
 282
 283    fn push_undo(&mut self, op_id: clock::Local) {
 284        assert_ne!(self.transaction_depth, 0);
 285        if let Some(Operation::Edit(edit)) = self.operations.get(&op_id) {
 286            let last_transaction = self.undo_stack.last_mut().unwrap();
 287            last_transaction.push_edit(&edit);
 288        }
 289    }
 290
 291    fn pop_undo(&mut self) -> Option<&HistoryEntry> {
 292        assert_eq!(self.transaction_depth, 0);
 293        if let Some(entry) = self.undo_stack.pop() {
 294            self.redo_stack.push(entry);
 295            self.redo_stack.last()
 296        } else {
 297            None
 298        }
 299    }
 300
 301    fn remove_from_undo(&mut self, transaction_id: TransactionId) -> &[HistoryEntry] {
 302        assert_eq!(self.transaction_depth, 0);
 303
 304        let redo_stack_start_len = self.redo_stack.len();
 305        if let Some(entry_ix) = self
 306            .undo_stack
 307            .iter()
 308            .rposition(|entry| entry.transaction.id == transaction_id)
 309        {
 310            self.redo_stack
 311                .extend(self.undo_stack.drain(entry_ix..).rev());
 312        }
 313        &self.redo_stack[redo_stack_start_len..]
 314    }
 315
 316    fn forget(&mut self, transaction_id: TransactionId) {
 317        assert_eq!(self.transaction_depth, 0);
 318        if let Some(entry_ix) = self
 319            .undo_stack
 320            .iter()
 321            .rposition(|entry| entry.transaction.id == transaction_id)
 322        {
 323            self.undo_stack.remove(entry_ix);
 324        } else if let Some(entry_ix) = self
 325            .redo_stack
 326            .iter()
 327            .rposition(|entry| entry.transaction.id == transaction_id)
 328        {
 329            self.undo_stack.remove(entry_ix);
 330        }
 331    }
 332
 333    fn pop_redo(&mut self) -> Option<&HistoryEntry> {
 334        assert_eq!(self.transaction_depth, 0);
 335        if let Some(entry) = self.redo_stack.pop() {
 336            self.undo_stack.push(entry);
 337            self.undo_stack.last()
 338        } else {
 339            None
 340        }
 341    }
 342
 343    fn remove_from_redo(&mut self, transaction_id: TransactionId) -> &[HistoryEntry] {
 344        assert_eq!(self.transaction_depth, 0);
 345
 346        let undo_stack_start_len = self.undo_stack.len();
 347        if let Some(entry_ix) = self
 348            .redo_stack
 349            .iter()
 350            .rposition(|entry| entry.transaction.id == transaction_id)
 351        {
 352            self.undo_stack
 353                .extend(self.redo_stack.drain(entry_ix..).rev());
 354        }
 355        &self.undo_stack[undo_stack_start_len..]
 356    }
 357}
 358
 359#[derive(Clone, Default, Debug)]
 360struct UndoMap(HashMap<clock::Local, Vec<(clock::Local, u32)>>);
 361
 362impl UndoMap {
 363    fn insert(&mut self, undo: &UndoOperation) {
 364        for (edit_id, count) in &undo.counts {
 365            self.0.entry(*edit_id).or_default().push((undo.id, *count));
 366        }
 367    }
 368
 369    fn is_undone(&self, edit_id: clock::Local) -> bool {
 370        self.undo_count(edit_id) % 2 == 1
 371    }
 372
 373    fn was_undone(&self, edit_id: clock::Local, version: &clock::Global) -> bool {
 374        let undo_count = self
 375            .0
 376            .get(&edit_id)
 377            .unwrap_or(&Vec::new())
 378            .iter()
 379            .filter(|(undo_id, _)| version.observed(*undo_id))
 380            .map(|(_, undo_count)| *undo_count)
 381            .max()
 382            .unwrap_or(0);
 383        undo_count % 2 == 1
 384    }
 385
 386    fn undo_count(&self, edit_id: clock::Local) -> u32 {
 387        self.0
 388            .get(&edit_id)
 389            .unwrap_or(&Vec::new())
 390            .iter()
 391            .map(|(_, undo_count)| *undo_count)
 392            .max()
 393            .unwrap_or(0)
 394    }
 395}
 396
 397struct Edits<'a, D: TextDimension, F: FnMut(&FragmentSummary) -> bool> {
 398    visible_cursor: rope::Cursor<'a>,
 399    deleted_cursor: rope::Cursor<'a>,
 400    fragments_cursor: Option<FilterCursor<'a, F, Fragment, FragmentTextSummary>>,
 401    undos: &'a UndoMap,
 402    since: &'a clock::Global,
 403    old_end: D,
 404    new_end: D,
 405    range: Range<(&'a Locator, usize)>,
 406}
 407
 408#[derive(Clone, Debug, Default, Eq, PartialEq)]
 409pub struct Edit<D> {
 410    pub old: Range<D>,
 411    pub new: Range<D>,
 412}
 413
 414impl<D> Edit<D>
 415where
 416    D: Sub<D, Output = D> + PartialEq + Copy,
 417{
 418    pub fn old_len(&self) -> D {
 419        self.old.end - self.old.start
 420    }
 421
 422    pub fn new_len(&self) -> D {
 423        self.new.end - self.new.start
 424    }
 425
 426    pub fn is_empty(&self) -> bool {
 427        self.old.start == self.old.end && self.new.start == self.new.end
 428    }
 429}
 430
 431impl<D1, D2> Edit<(D1, D2)> {
 432    pub fn flatten(self) -> (Edit<D1>, Edit<D2>) {
 433        (
 434            Edit {
 435                old: self.old.start.0..self.old.end.0,
 436                new: self.new.start.0..self.new.end.0,
 437            },
 438            Edit {
 439                old: self.old.start.1..self.old.end.1,
 440                new: self.new.start.1..self.new.end.1,
 441            },
 442        )
 443    }
 444}
 445
 446#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, PartialOrd, Ord)]
 447pub struct InsertionTimestamp {
 448    pub replica_id: ReplicaId,
 449    pub local: clock::Seq,
 450    pub lamport: clock::Seq,
 451}
 452
 453impl InsertionTimestamp {
 454    pub fn local(&self) -> clock::Local {
 455        clock::Local {
 456            replica_id: self.replica_id,
 457            value: self.local,
 458        }
 459    }
 460
 461    pub fn lamport(&self) -> clock::Lamport {
 462        clock::Lamport {
 463            replica_id: self.replica_id,
 464            value: self.lamport,
 465        }
 466    }
 467}
 468
 469#[derive(Eq, PartialEq, Clone, Debug)]
 470pub struct Fragment {
 471    pub id: Locator,
 472    pub insertion_timestamp: InsertionTimestamp,
 473    pub insertion_offset: usize,
 474    pub len: usize,
 475    pub visible: bool,
 476    pub deletions: HashSet<clock::Local>,
 477    pub max_undos: clock::Global,
 478}
 479
 480#[derive(Eq, PartialEq, Clone, Debug)]
 481pub struct FragmentSummary {
 482    text: FragmentTextSummary,
 483    max_id: Locator,
 484    max_version: clock::Global,
 485    min_insertion_version: clock::Global,
 486    max_insertion_version: clock::Global,
 487}
 488
 489#[derive(Copy, Default, Clone, Debug, PartialEq, Eq)]
 490struct FragmentTextSummary {
 491    visible: usize,
 492    deleted: usize,
 493}
 494
 495impl<'a> sum_tree::Dimension<'a, FragmentSummary> for FragmentTextSummary {
 496    fn add_summary(&mut self, summary: &'a FragmentSummary, _: &Option<clock::Global>) {
 497        self.visible += summary.text.visible;
 498        self.deleted += summary.text.deleted;
 499    }
 500}
 501
 502#[derive(Eq, PartialEq, Clone, Debug)]
 503struct InsertionFragment {
 504    timestamp: clock::Local,
 505    split_offset: usize,
 506    fragment_id: Locator,
 507}
 508
 509#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
 510struct InsertionFragmentKey {
 511    timestamp: clock::Local,
 512    split_offset: usize,
 513}
 514
 515#[derive(Clone, Debug, Eq, PartialEq)]
 516pub enum Operation {
 517    Edit(EditOperation),
 518    Undo {
 519        undo: UndoOperation,
 520        lamport_timestamp: clock::Lamport,
 521    },
 522}
 523
 524#[derive(Clone, Debug, Eq, PartialEq)]
 525pub struct EditOperation {
 526    pub timestamp: InsertionTimestamp,
 527    pub version: clock::Global,
 528    pub ranges: Vec<Range<FullOffset>>,
 529    pub new_text: Vec<Arc<str>>,
 530}
 531
 532#[derive(Clone, Debug, Eq, PartialEq)]
 533pub struct UndoOperation {
 534    pub id: clock::Local,
 535    pub counts: HashMap<clock::Local, u32>,
 536    pub transaction_ranges: Vec<Range<FullOffset>>,
 537    pub transaction_version: clock::Global,
 538    pub version: clock::Global,
 539}
 540
 541impl Buffer {
 542    pub fn new(replica_id: u16, remote_id: u64, history: History) -> Buffer {
 543        let mut fragments = SumTree::new();
 544        let mut insertions = SumTree::new();
 545
 546        let mut local_clock = clock::Local::new(replica_id);
 547        let mut lamport_clock = clock::Lamport::new(replica_id);
 548        let mut version = clock::Global::new();
 549        let visible_text = Rope::from(history.base_text.as_ref());
 550        if visible_text.len() > 0 {
 551            let insertion_timestamp = InsertionTimestamp {
 552                replica_id: 0,
 553                local: 1,
 554                lamport: 1,
 555            };
 556            local_clock.observe(insertion_timestamp.local());
 557            lamport_clock.observe(insertion_timestamp.lamport());
 558            version.observe(insertion_timestamp.local());
 559            let fragment_id = Locator::between(&Locator::min(), &Locator::max());
 560            let fragment = Fragment {
 561                id: fragment_id,
 562                insertion_timestamp,
 563                insertion_offset: 0,
 564                len: visible_text.len(),
 565                visible: true,
 566                deletions: Default::default(),
 567                max_undos: Default::default(),
 568            };
 569            insertions.push(InsertionFragment::new(&fragment), &());
 570            fragments.push(fragment, &None);
 571        }
 572
 573        Buffer {
 574            snapshot: BufferSnapshot {
 575                replica_id,
 576                remote_id,
 577                visible_text,
 578                deleted_text: Rope::new(),
 579                fragments,
 580                insertions,
 581                version,
 582                undo_map: Default::default(),
 583            },
 584            history,
 585            deferred_ops: OperationQueue::new(),
 586            deferred_replicas: HashSet::default(),
 587            replica_id,
 588            local_clock,
 589            lamport_clock,
 590            subscriptions: Default::default(),
 591            edit_id_resolvers: Default::default(),
 592            version_barriers: Default::default(),
 593        }
 594    }
 595
 596    pub fn version(&self) -> clock::Global {
 597        self.version.clone()
 598    }
 599
 600    pub fn snapshot(&self) -> BufferSnapshot {
 601        self.snapshot.clone()
 602    }
 603
 604    pub fn replica_id(&self) -> ReplicaId {
 605        self.local_clock.replica_id
 606    }
 607
 608    pub fn remote_id(&self) -> u64 {
 609        self.remote_id
 610    }
 611
 612    pub fn deferred_ops_len(&self) -> usize {
 613        self.deferred_ops.len()
 614    }
 615
 616    pub fn transaction_group_interval(&self) -> Duration {
 617        self.history.group_interval
 618    }
 619
 620    pub fn edit<R, I, S, T>(&mut self, edits: R) -> Operation
 621    where
 622        R: IntoIterator<IntoIter = I>,
 623        I: ExactSizeIterator<Item = (Range<S>, T)>,
 624        S: ToOffset,
 625        T: Into<Arc<str>>,
 626    {
 627        let edits = edits
 628            .into_iter()
 629            .map(|(range, new_text)| (range, new_text.into()));
 630
 631        self.start_transaction();
 632        let timestamp = InsertionTimestamp {
 633            replica_id: self.replica_id,
 634            local: self.local_clock.tick().value,
 635            lamport: self.lamport_clock.tick().value,
 636        };
 637        let operation = Operation::Edit(self.apply_local_edit(edits, timestamp));
 638
 639        self.history.push(operation.clone());
 640        self.history.push_undo(operation.local_timestamp());
 641        self.snapshot.version.observe(operation.local_timestamp());
 642        self.end_transaction();
 643        operation
 644    }
 645
 646    fn apply_local_edit<S: ToOffset, T: Into<Arc<str>>>(
 647        &mut self,
 648        edits: impl ExactSizeIterator<Item = (Range<S>, T)>,
 649        timestamp: InsertionTimestamp,
 650    ) -> EditOperation {
 651        let mut edits_patch = Patch::default();
 652        let mut edit_op = EditOperation {
 653            timestamp,
 654            version: self.version(),
 655            ranges: Vec::with_capacity(edits.len()),
 656            new_text: Vec::with_capacity(edits.len()),
 657        };
 658        let mut new_insertions = Vec::new();
 659        let mut insertion_offset = 0;
 660
 661        let mut ranges = edits
 662            .map(|(range, new_text)| (range.to_offset(&*self), new_text))
 663            .peekable();
 664
 665        let mut new_ropes =
 666            RopeBuilder::new(self.visible_text.cursor(0), self.deleted_text.cursor(0));
 667        let mut old_fragments = self.fragments.cursor::<FragmentTextSummary>();
 668        let mut new_fragments =
 669            old_fragments.slice(&ranges.peek().unwrap().0.start, Bias::Right, &None);
 670        new_ropes.push_tree(new_fragments.summary().text);
 671
 672        let mut fragment_start = old_fragments.start().visible;
 673        for (range, new_text) in ranges {
 674            let new_text = new_text.into();
 675            let fragment_end = old_fragments.end(&None).visible;
 676
 677            // If the current fragment ends before this range, then jump ahead to the first fragment
 678            // that extends past the start of this range, reusing any intervening fragments.
 679            if fragment_end < range.start {
 680                // If the current fragment has been partially consumed, then consume the rest of it
 681                // and advance to the next fragment before slicing.
 682                if fragment_start > old_fragments.start().visible {
 683                    if fragment_end > fragment_start {
 684                        let mut suffix = old_fragments.item().unwrap().clone();
 685                        suffix.len = fragment_end - fragment_start;
 686                        suffix.insertion_offset += fragment_start - old_fragments.start().visible;
 687                        new_insertions.push(InsertionFragment::insert_new(&suffix));
 688                        new_ropes.push_fragment(&suffix, suffix.visible);
 689                        new_fragments.push(suffix, &None);
 690                    }
 691                    old_fragments.next(&None);
 692                }
 693
 694                let slice = old_fragments.slice(&range.start, Bias::Right, &None);
 695                new_ropes.push_tree(slice.summary().text);
 696                new_fragments.push_tree(slice, &None);
 697                fragment_start = old_fragments.start().visible;
 698            }
 699
 700            let full_range_start = FullOffset(range.start + old_fragments.start().deleted);
 701
 702            // Preserve any portion of the current fragment that precedes this range.
 703            if fragment_start < range.start {
 704                let mut prefix = old_fragments.item().unwrap().clone();
 705                prefix.len = range.start - fragment_start;
 706                prefix.insertion_offset += fragment_start - old_fragments.start().visible;
 707                prefix.id = Locator::between(&new_fragments.summary().max_id, &prefix.id);
 708                new_insertions.push(InsertionFragment::insert_new(&prefix));
 709                new_ropes.push_fragment(&prefix, prefix.visible);
 710                new_fragments.push(prefix, &None);
 711                fragment_start = range.start;
 712            }
 713
 714            // Insert the new text before any existing fragments within the range.
 715            if !new_text.is_empty() {
 716                let new_start = new_fragments.summary().text.visible;
 717                edits_patch.push(Edit {
 718                    old: fragment_start..fragment_start,
 719                    new: new_start..new_start + new_text.len(),
 720                });
 721                let fragment = Fragment {
 722                    id: Locator::between(
 723                        &new_fragments.summary().max_id,
 724                        old_fragments
 725                            .item()
 726                            .map_or(&Locator::max(), |old_fragment| &old_fragment.id),
 727                    ),
 728                    insertion_timestamp: timestamp,
 729                    insertion_offset,
 730                    len: new_text.len(),
 731                    deletions: Default::default(),
 732                    max_undos: Default::default(),
 733                    visible: true,
 734                };
 735                new_insertions.push(InsertionFragment::insert_new(&fragment));
 736                new_ropes.push_str(new_text.as_ref());
 737                new_fragments.push(fragment, &None);
 738                insertion_offset += new_text.len();
 739            }
 740
 741            // Advance through every fragment that intersects this range, marking the intersecting
 742            // portions as deleted.
 743            while fragment_start < range.end {
 744                let fragment = old_fragments.item().unwrap();
 745                let fragment_end = old_fragments.end(&None).visible;
 746                let mut intersection = fragment.clone();
 747                let intersection_end = cmp::min(range.end, fragment_end);
 748                if fragment.visible {
 749                    intersection.len = intersection_end - fragment_start;
 750                    intersection.insertion_offset += fragment_start - old_fragments.start().visible;
 751                    intersection.id =
 752                        Locator::between(&new_fragments.summary().max_id, &intersection.id);
 753                    intersection.deletions.insert(timestamp.local());
 754                    intersection.visible = false;
 755                }
 756                if intersection.len > 0 {
 757                    if fragment.visible && !intersection.visible {
 758                        let new_start = new_fragments.summary().text.visible;
 759                        edits_patch.push(Edit {
 760                            old: fragment_start..intersection_end,
 761                            new: new_start..new_start,
 762                        });
 763                    }
 764                    new_insertions.push(InsertionFragment::insert_new(&intersection));
 765                    new_ropes.push_fragment(&intersection, fragment.visible);
 766                    new_fragments.push(intersection, &None);
 767                    fragment_start = intersection_end;
 768                }
 769                if fragment_end <= range.end {
 770                    old_fragments.next(&None);
 771                }
 772            }
 773
 774            let full_range_end = FullOffset(range.end + old_fragments.start().deleted);
 775            edit_op.ranges.push(full_range_start..full_range_end);
 776            edit_op.new_text.push(new_text);
 777        }
 778
 779        // If the current fragment has been partially consumed, then consume the rest of it
 780        // and advance to the next fragment before slicing.
 781        if fragment_start > old_fragments.start().visible {
 782            let fragment_end = old_fragments.end(&None).visible;
 783            if fragment_end > fragment_start {
 784                let mut suffix = old_fragments.item().unwrap().clone();
 785                suffix.len = fragment_end - fragment_start;
 786                suffix.insertion_offset += fragment_start - old_fragments.start().visible;
 787                new_insertions.push(InsertionFragment::insert_new(&suffix));
 788                new_ropes.push_fragment(&suffix, suffix.visible);
 789                new_fragments.push(suffix, &None);
 790            }
 791            old_fragments.next(&None);
 792        }
 793
 794        let suffix = old_fragments.suffix(&None);
 795        new_ropes.push_tree(suffix.summary().text);
 796        new_fragments.push_tree(suffix, &None);
 797        let (visible_text, deleted_text) = new_ropes.finish();
 798        drop(old_fragments);
 799
 800        self.snapshot.fragments = new_fragments;
 801        self.snapshot.insertions.edit(new_insertions, &());
 802        self.snapshot.visible_text = visible_text;
 803        self.snapshot.deleted_text = deleted_text;
 804        self.subscriptions.publish_mut(&edits_patch);
 805        edit_op
 806    }
 807
 808    pub fn apply_ops<I: IntoIterator<Item = Operation>>(&mut self, ops: I) -> Result<()> {
 809        let mut deferred_ops = Vec::new();
 810        for op in ops {
 811            self.history.push(op.clone());
 812            if self.can_apply_op(&op) {
 813                self.apply_op(op)?;
 814            } else {
 815                self.deferred_replicas.insert(op.replica_id());
 816                deferred_ops.push(op);
 817            }
 818        }
 819        self.deferred_ops.insert(deferred_ops);
 820        self.flush_deferred_ops()?;
 821        Ok(())
 822    }
 823
 824    fn apply_op(&mut self, op: Operation) -> Result<()> {
 825        match op {
 826            Operation::Edit(edit) => {
 827                if !self.version.observed(edit.timestamp.local()) {
 828                    self.apply_remote_edit(
 829                        &edit.version,
 830                        &edit.ranges,
 831                        &edit.new_text,
 832                        edit.timestamp,
 833                    );
 834                    self.snapshot.version.observe(edit.timestamp.local());
 835                    self.local_clock.observe(edit.timestamp.local());
 836                    self.lamport_clock.observe(edit.timestamp.lamport());
 837                    self.resolve_edit(edit.timestamp.local());
 838                }
 839            }
 840            Operation::Undo {
 841                undo,
 842                lamport_timestamp,
 843            } => {
 844                if !self.version.observed(undo.id) {
 845                    self.apply_undo(&undo)?;
 846                    self.snapshot.version.observe(undo.id);
 847                    self.local_clock.observe(undo.id);
 848                    self.lamport_clock.observe(lamport_timestamp);
 849                }
 850            }
 851        }
 852        self.version_barriers
 853            .retain(|(version, _)| !self.snapshot.version().observed_all(version));
 854        Ok(())
 855    }
 856
 857    fn apply_remote_edit(
 858        &mut self,
 859        version: &clock::Global,
 860        ranges: &[Range<FullOffset>],
 861        new_text: &[Arc<str>],
 862        timestamp: InsertionTimestamp,
 863    ) {
 864        if ranges.is_empty() {
 865            return;
 866        }
 867
 868        let edits = ranges.into_iter().zip(new_text.into_iter());
 869        let mut edits_patch = Patch::default();
 870        let cx = Some(version.clone());
 871        let mut new_insertions = Vec::new();
 872        let mut insertion_offset = 0;
 873        let mut new_ropes =
 874            RopeBuilder::new(self.visible_text.cursor(0), self.deleted_text.cursor(0));
 875        let mut old_fragments = self.fragments.cursor::<(VersionedFullOffset, usize)>();
 876        let mut new_fragments = old_fragments.slice(
 877            &VersionedFullOffset::Offset(ranges[0].start),
 878            Bias::Left,
 879            &cx,
 880        );
 881        new_ropes.push_tree(new_fragments.summary().text);
 882
 883        let mut fragment_start = old_fragments.start().0.full_offset();
 884        for (range, new_text) in edits {
 885            let fragment_end = old_fragments.end(&cx).0.full_offset();
 886
 887            // If the current fragment ends before this range, then jump ahead to the first fragment
 888            // that extends past the start of this range, reusing any intervening fragments.
 889            if fragment_end < range.start {
 890                // If the current fragment has been partially consumed, then consume the rest of it
 891                // and advance to the next fragment before slicing.
 892                if fragment_start > old_fragments.start().0.full_offset() {
 893                    if fragment_end > fragment_start {
 894                        let mut suffix = old_fragments.item().unwrap().clone();
 895                        suffix.len = fragment_end.0 - fragment_start.0;
 896                        suffix.insertion_offset +=
 897                            fragment_start - old_fragments.start().0.full_offset();
 898                        new_insertions.push(InsertionFragment::insert_new(&suffix));
 899                        new_ropes.push_fragment(&suffix, suffix.visible);
 900                        new_fragments.push(suffix, &None);
 901                    }
 902                    old_fragments.next(&cx);
 903                }
 904
 905                let slice =
 906                    old_fragments.slice(&VersionedFullOffset::Offset(range.start), Bias::Left, &cx);
 907                new_ropes.push_tree(slice.summary().text);
 908                new_fragments.push_tree(slice, &None);
 909                fragment_start = old_fragments.start().0.full_offset();
 910            }
 911
 912            // If we are at the end of a non-concurrent fragment, advance to the next one.
 913            let fragment_end = old_fragments.end(&cx).0.full_offset();
 914            if fragment_end == range.start && fragment_end > fragment_start {
 915                let mut fragment = old_fragments.item().unwrap().clone();
 916                fragment.len = fragment_end.0 - fragment_start.0;
 917                fragment.insertion_offset += fragment_start - old_fragments.start().0.full_offset();
 918                new_insertions.push(InsertionFragment::insert_new(&fragment));
 919                new_ropes.push_fragment(&fragment, fragment.visible);
 920                new_fragments.push(fragment, &None);
 921                old_fragments.next(&cx);
 922                fragment_start = old_fragments.start().0.full_offset();
 923            }
 924
 925            // Skip over insertions that are concurrent to this edit, but have a lower lamport
 926            // timestamp.
 927            while let Some(fragment) = old_fragments.item() {
 928                if fragment_start == range.start
 929                    && fragment.insertion_timestamp.lamport() > timestamp.lamport()
 930                {
 931                    new_ropes.push_fragment(fragment, fragment.visible);
 932                    new_fragments.push(fragment.clone(), &None);
 933                    old_fragments.next(&cx);
 934                    debug_assert_eq!(fragment_start, range.start);
 935                } else {
 936                    break;
 937                }
 938            }
 939            debug_assert!(fragment_start <= range.start);
 940
 941            // Preserve any portion of the current fragment that precedes this range.
 942            if fragment_start < range.start {
 943                let mut prefix = old_fragments.item().unwrap().clone();
 944                prefix.len = range.start.0 - fragment_start.0;
 945                prefix.insertion_offset += fragment_start - old_fragments.start().0.full_offset();
 946                prefix.id = Locator::between(&new_fragments.summary().max_id, &prefix.id);
 947                new_insertions.push(InsertionFragment::insert_new(&prefix));
 948                fragment_start = range.start;
 949                new_ropes.push_fragment(&prefix, prefix.visible);
 950                new_fragments.push(prefix, &None);
 951            }
 952
 953            // Insert the new text before any existing fragments within the range.
 954            if !new_text.is_empty() {
 955                let mut old_start = old_fragments.start().1;
 956                if old_fragments.item().map_or(false, |f| f.visible) {
 957                    old_start += fragment_start.0 - old_fragments.start().0.full_offset().0;
 958                }
 959                let new_start = new_fragments.summary().text.visible;
 960                edits_patch.push(Edit {
 961                    old: old_start..old_start,
 962                    new: new_start..new_start + new_text.len(),
 963                });
 964                let fragment = Fragment {
 965                    id: Locator::between(
 966                        &new_fragments.summary().max_id,
 967                        old_fragments
 968                            .item()
 969                            .map_or(&Locator::max(), |old_fragment| &old_fragment.id),
 970                    ),
 971                    insertion_timestamp: timestamp,
 972                    insertion_offset,
 973                    len: new_text.len(),
 974                    deletions: Default::default(),
 975                    max_undos: Default::default(),
 976                    visible: true,
 977                };
 978                new_insertions.push(InsertionFragment::insert_new(&fragment));
 979                new_ropes.push_str(new_text);
 980                new_fragments.push(fragment, &None);
 981                insertion_offset += new_text.len();
 982            }
 983
 984            // Advance through every fragment that intersects this range, marking the intersecting
 985            // portions as deleted.
 986            while fragment_start < range.end {
 987                let fragment = old_fragments.item().unwrap();
 988                let fragment_end = old_fragments.end(&cx).0.full_offset();
 989                let mut intersection = fragment.clone();
 990                let intersection_end = cmp::min(range.end, fragment_end);
 991                if fragment.was_visible(version, &self.undo_map) {
 992                    intersection.len = intersection_end.0 - fragment_start.0;
 993                    intersection.insertion_offset +=
 994                        fragment_start - old_fragments.start().0.full_offset();
 995                    intersection.id =
 996                        Locator::between(&new_fragments.summary().max_id, &intersection.id);
 997                    intersection.deletions.insert(timestamp.local());
 998                    intersection.visible = false;
 999                }
1000                if intersection.len > 0 {
1001                    if fragment.visible && !intersection.visible {
1002                        let old_start = old_fragments.start().1
1003                            + (fragment_start.0 - old_fragments.start().0.full_offset().0);
1004                        let new_start = new_fragments.summary().text.visible;
1005                        edits_patch.push(Edit {
1006                            old: old_start..old_start + intersection.len,
1007                            new: new_start..new_start,
1008                        });
1009                    }
1010                    new_insertions.push(InsertionFragment::insert_new(&intersection));
1011                    new_ropes.push_fragment(&intersection, fragment.visible);
1012                    new_fragments.push(intersection, &None);
1013                    fragment_start = intersection_end;
1014                }
1015                if fragment_end <= range.end {
1016                    old_fragments.next(&cx);
1017                }
1018            }
1019        }
1020
1021        // If the current fragment has been partially consumed, then consume the rest of it
1022        // and advance to the next fragment before slicing.
1023        if fragment_start > old_fragments.start().0.full_offset() {
1024            let fragment_end = old_fragments.end(&cx).0.full_offset();
1025            if fragment_end > fragment_start {
1026                let mut suffix = old_fragments.item().unwrap().clone();
1027                suffix.len = fragment_end.0 - fragment_start.0;
1028                suffix.insertion_offset += fragment_start - old_fragments.start().0.full_offset();
1029                new_insertions.push(InsertionFragment::insert_new(&suffix));
1030                new_ropes.push_fragment(&suffix, suffix.visible);
1031                new_fragments.push(suffix, &None);
1032            }
1033            old_fragments.next(&cx);
1034        }
1035
1036        let suffix = old_fragments.suffix(&cx);
1037        new_ropes.push_tree(suffix.summary().text);
1038        new_fragments.push_tree(suffix, &None);
1039        let (visible_text, deleted_text) = new_ropes.finish();
1040        drop(old_fragments);
1041
1042        self.snapshot.fragments = new_fragments;
1043        self.snapshot.visible_text = visible_text;
1044        self.snapshot.deleted_text = deleted_text;
1045        self.snapshot.insertions.edit(new_insertions, &());
1046        self.subscriptions.publish_mut(&edits_patch)
1047    }
1048
1049    fn apply_undo(&mut self, undo: &UndoOperation) -> Result<()> {
1050        let mut edits = Patch::default();
1051        self.snapshot.undo_map.insert(undo);
1052
1053        let mut cx = undo.transaction_version.clone();
1054        for edit_id in undo.counts.keys().copied() {
1055            cx.observe(edit_id);
1056        }
1057        let cx = Some(cx);
1058
1059        let mut old_fragments = self.fragments.cursor::<(VersionedFullOffset, usize)>();
1060        let mut new_fragments = old_fragments.slice(
1061            &VersionedFullOffset::Offset(undo.transaction_ranges[0].start),
1062            Bias::Right,
1063            &cx,
1064        );
1065        let mut new_ropes =
1066            RopeBuilder::new(self.visible_text.cursor(0), self.deleted_text.cursor(0));
1067        new_ropes.push_tree(new_fragments.summary().text);
1068
1069        for range in &undo.transaction_ranges {
1070            let mut end_offset = old_fragments.end(&cx).0.full_offset();
1071
1072            if end_offset < range.start {
1073                let preceding_fragments = old_fragments.slice(
1074                    &VersionedFullOffset::Offset(range.start),
1075                    Bias::Right,
1076                    &cx,
1077                );
1078                new_ropes.push_tree(preceding_fragments.summary().text);
1079                new_fragments.push_tree(preceding_fragments, &None);
1080            }
1081
1082            while end_offset <= range.end {
1083                if let Some(fragment) = old_fragments.item() {
1084                    let mut fragment = fragment.clone();
1085                    let fragment_was_visible = fragment.visible;
1086
1087                    if fragment.was_visible(&undo.transaction_version, &self.undo_map)
1088                        || undo
1089                            .counts
1090                            .contains_key(&fragment.insertion_timestamp.local())
1091                    {
1092                        fragment.visible = fragment.is_visible(&self.undo_map);
1093                        fragment.max_undos.observe(undo.id);
1094                    }
1095
1096                    let old_start = old_fragments.start().1;
1097                    let new_start = new_fragments.summary().text.visible;
1098                    if fragment_was_visible && !fragment.visible {
1099                        edits.push(Edit {
1100                            old: old_start..old_start + fragment.len,
1101                            new: new_start..new_start,
1102                        });
1103                    } else if !fragment_was_visible && fragment.visible {
1104                        edits.push(Edit {
1105                            old: old_start..old_start,
1106                            new: new_start..new_start + fragment.len,
1107                        });
1108                    }
1109                    new_ropes.push_fragment(&fragment, fragment_was_visible);
1110                    new_fragments.push(fragment, &None);
1111
1112                    old_fragments.next(&cx);
1113                    if end_offset == old_fragments.end(&cx).0.full_offset() {
1114                        let unseen_fragments = old_fragments.slice(
1115                            &VersionedFullOffset::Offset(end_offset),
1116                            Bias::Right,
1117                            &cx,
1118                        );
1119                        new_ropes.push_tree(unseen_fragments.summary().text);
1120                        new_fragments.push_tree(unseen_fragments, &None);
1121                    }
1122                    end_offset = old_fragments.end(&cx).0.full_offset();
1123                } else {
1124                    break;
1125                }
1126            }
1127        }
1128
1129        let suffix = old_fragments.suffix(&cx);
1130        new_ropes.push_tree(suffix.summary().text);
1131        new_fragments.push_tree(suffix, &None);
1132
1133        drop(old_fragments);
1134        let (visible_text, deleted_text) = new_ropes.finish();
1135        self.snapshot.fragments = new_fragments;
1136        self.snapshot.visible_text = visible_text;
1137        self.snapshot.deleted_text = deleted_text;
1138        self.subscriptions.publish_mut(&edits);
1139        Ok(())
1140    }
1141
1142    fn flush_deferred_ops(&mut self) -> Result<()> {
1143        self.deferred_replicas.clear();
1144        let mut deferred_ops = Vec::new();
1145        for op in self.deferred_ops.drain().iter().cloned() {
1146            if self.can_apply_op(&op) {
1147                self.apply_op(op)?;
1148            } else {
1149                self.deferred_replicas.insert(op.replica_id());
1150                deferred_ops.push(op);
1151            }
1152        }
1153        self.deferred_ops.insert(deferred_ops);
1154        Ok(())
1155    }
1156
1157    fn can_apply_op(&self, op: &Operation) -> bool {
1158        if self.deferred_replicas.contains(&op.replica_id()) {
1159            false
1160        } else {
1161            match op {
1162                Operation::Edit(edit) => self.version.observed_all(&edit.version),
1163                Operation::Undo { undo, .. } => self.version.observed_all(&undo.version),
1164            }
1165        }
1166    }
1167
1168    pub fn peek_undo_stack(&self) -> Option<&HistoryEntry> {
1169        self.history.undo_stack.last()
1170    }
1171
1172    pub fn peek_redo_stack(&self) -> Option<&HistoryEntry> {
1173        self.history.redo_stack.last()
1174    }
1175
1176    pub fn start_transaction(&mut self) -> Option<TransactionId> {
1177        self.start_transaction_at(Instant::now())
1178    }
1179
1180    pub fn start_transaction_at(&mut self, now: Instant) -> Option<TransactionId> {
1181        self.history
1182            .start_transaction(self.version.clone(), now, &mut self.local_clock)
1183    }
1184
1185    pub fn end_transaction(&mut self) -> Option<(TransactionId, clock::Global)> {
1186        self.end_transaction_at(Instant::now())
1187    }
1188
1189    pub fn end_transaction_at(&mut self, now: Instant) -> Option<(TransactionId, clock::Global)> {
1190        if let Some(entry) = self.history.end_transaction(now) {
1191            let since = entry.transaction.start.clone();
1192            let id = self.history.group().unwrap();
1193            Some((id, since))
1194        } else {
1195            None
1196        }
1197    }
1198
1199    pub fn finalize_last_transaction(&mut self) -> Option<&Transaction> {
1200        self.history.finalize_last_transaction()
1201    }
1202
1203    pub fn base_text(&self) -> &Arc<str> {
1204        &self.history.base_text
1205    }
1206
1207    pub fn history(&self) -> impl Iterator<Item = &Operation> {
1208        self.history.operations.values()
1209    }
1210
1211    pub fn undo_history(&self) -> impl Iterator<Item = (&clock::Local, &[(clock::Local, u32)])> {
1212        self.undo_map
1213            .0
1214            .iter()
1215            .map(|(edit_id, undo_counts)| (edit_id, undo_counts.as_slice()))
1216    }
1217
1218    pub fn undo(&mut self) -> Option<(TransactionId, Operation)> {
1219        if let Some(entry) = self.history.pop_undo() {
1220            let transaction = entry.transaction.clone();
1221            let transaction_id = transaction.id;
1222            let op = self.undo_or_redo(transaction).unwrap();
1223            Some((transaction_id, op))
1224        } else {
1225            None
1226        }
1227    }
1228
1229    pub fn undo_to_transaction(&mut self, transaction_id: TransactionId) -> Vec<Operation> {
1230        let transactions = self
1231            .history
1232            .remove_from_undo(transaction_id)
1233            .iter()
1234            .map(|entry| entry.transaction.clone())
1235            .collect::<Vec<_>>();
1236        transactions
1237            .into_iter()
1238            .map(|transaction| self.undo_or_redo(transaction).unwrap())
1239            .collect()
1240    }
1241
1242    pub fn forget_transaction(&mut self, transaction_id: TransactionId) {
1243        self.history.forget(transaction_id);
1244    }
1245
1246    pub fn redo(&mut self) -> Option<(TransactionId, Operation)> {
1247        if let Some(entry) = self.history.pop_redo() {
1248            let transaction = entry.transaction.clone();
1249            let transaction_id = transaction.id;
1250            let op = self.undo_or_redo(transaction).unwrap();
1251            Some((transaction_id, op))
1252        } else {
1253            None
1254        }
1255    }
1256
1257    pub fn redo_to_transaction(&mut self, transaction_id: TransactionId) -> Vec<Operation> {
1258        let transactions = self
1259            .history
1260            .remove_from_redo(transaction_id)
1261            .iter()
1262            .map(|entry| entry.transaction.clone())
1263            .collect::<Vec<_>>();
1264        transactions
1265            .into_iter()
1266            .map(|transaction| self.undo_or_redo(transaction).unwrap())
1267            .collect()
1268    }
1269
1270    fn undo_or_redo(&mut self, transaction: Transaction) -> Result<Operation> {
1271        let mut counts = HashMap::default();
1272        for edit_id in transaction.edit_ids {
1273            counts.insert(edit_id, self.undo_map.undo_count(edit_id) + 1);
1274        }
1275
1276        let undo = UndoOperation {
1277            id: self.local_clock.tick(),
1278            version: self.version(),
1279            counts,
1280            transaction_ranges: transaction.ranges,
1281            transaction_version: transaction.start.clone(),
1282        };
1283        self.apply_undo(&undo)?;
1284        let operation = Operation::Undo {
1285            undo,
1286            lamport_timestamp: self.lamport_clock.tick(),
1287        };
1288        self.snapshot.version.observe(operation.local_timestamp());
1289        self.history.push(operation.clone());
1290        Ok(operation)
1291    }
1292
1293    pub fn push_transaction(&mut self, transaction: Transaction, now: Instant) {
1294        self.history.push_transaction(transaction, now);
1295        self.history.finalize_last_transaction();
1296    }
1297
1298    pub fn subscribe(&mut self) -> Subscription {
1299        self.subscriptions.subscribe()
1300    }
1301
1302    pub fn wait_for_edits(
1303        &mut self,
1304        edit_ids: impl IntoIterator<Item = clock::Local>,
1305    ) -> impl 'static + Future<Output = ()> {
1306        let mut futures = Vec::new();
1307        for edit_id in edit_ids {
1308            if !self.version.observed(edit_id) {
1309                let (tx, rx) = oneshot::channel();
1310                self.edit_id_resolvers.entry(edit_id).or_default().push(tx);
1311                futures.push(rx);
1312            }
1313        }
1314
1315        async move {
1316            for mut future in futures {
1317                future.recv().await;
1318            }
1319        }
1320    }
1321
1322    pub fn wait_for_anchors<'a>(
1323        &mut self,
1324        anchors: impl IntoIterator<Item = &'a Anchor>,
1325    ) -> impl 'static + Future<Output = ()> {
1326        let mut futures = Vec::new();
1327        for anchor in anchors {
1328            if !self.version.observed(anchor.timestamp)
1329                && *anchor != Anchor::MAX
1330                && *anchor != Anchor::MIN
1331            {
1332                let (tx, rx) = oneshot::channel();
1333                self.edit_id_resolvers
1334                    .entry(anchor.timestamp)
1335                    .or_default()
1336                    .push(tx);
1337                futures.push(rx);
1338            }
1339        }
1340
1341        async move {
1342            for mut future in futures {
1343                future.recv().await;
1344            }
1345        }
1346    }
1347
1348    pub fn wait_for_version(&mut self, version: clock::Global) -> impl Future<Output = ()> {
1349        let (tx, mut rx) = barrier::channel();
1350        if !self.snapshot.version.observed_all(&version) {
1351            self.version_barriers.push((version, tx));
1352        }
1353        async move {
1354            rx.recv().await;
1355        }
1356    }
1357
1358    fn resolve_edit(&mut self, edit_id: clock::Local) {
1359        for mut tx in self
1360            .edit_id_resolvers
1361            .remove(&edit_id)
1362            .into_iter()
1363            .flatten()
1364        {
1365            let _ = tx.try_send(());
1366        }
1367    }
1368}
1369
1370#[cfg(any(test, feature = "test-support"))]
1371impl Buffer {
1372    pub fn check_invariants(&self) {
1373        // Ensure every fragment is ordered by locator in the fragment tree and corresponds
1374        // to an insertion fragment in the insertions tree.
1375        let mut prev_fragment_id = Locator::min();
1376        for fragment in self.snapshot.fragments.items(&None) {
1377            assert!(fragment.id > prev_fragment_id);
1378            prev_fragment_id = fragment.id.clone();
1379
1380            let insertion_fragment = self
1381                .snapshot
1382                .insertions
1383                .get(
1384                    &InsertionFragmentKey {
1385                        timestamp: fragment.insertion_timestamp.local(),
1386                        split_offset: fragment.insertion_offset,
1387                    },
1388                    &(),
1389                )
1390                .unwrap();
1391            assert_eq!(
1392                insertion_fragment.fragment_id, fragment.id,
1393                "fragment: {:?}\ninsertion: {:?}",
1394                fragment, insertion_fragment
1395            );
1396        }
1397
1398        let mut cursor = self.snapshot.fragments.cursor::<Option<&Locator>>();
1399        for insertion_fragment in self.snapshot.insertions.cursor::<()>() {
1400            cursor.seek(&Some(&insertion_fragment.fragment_id), Bias::Left, &None);
1401            let fragment = cursor.item().unwrap();
1402            assert_eq!(insertion_fragment.fragment_id, fragment.id);
1403            assert_eq!(insertion_fragment.split_offset, fragment.insertion_offset);
1404        }
1405
1406        let fragment_summary = self.snapshot.fragments.summary();
1407        assert_eq!(
1408            fragment_summary.text.visible,
1409            self.snapshot.visible_text.len()
1410        );
1411        assert_eq!(
1412            fragment_summary.text.deleted,
1413            self.snapshot.deleted_text.len()
1414        );
1415    }
1416
1417    pub fn set_group_interval(&mut self, group_interval: Duration) {
1418        self.history.group_interval = group_interval;
1419    }
1420
1421    pub fn random_byte_range(&self, start_offset: usize, rng: &mut impl rand::Rng) -> Range<usize> {
1422        let end = self.clip_offset(rng.gen_range(start_offset..=self.len()), Bias::Right);
1423        let start = self.clip_offset(rng.gen_range(start_offset..=end), Bias::Right);
1424        start..end
1425    }
1426
1427    pub fn randomly_edit<T>(
1428        &mut self,
1429        rng: &mut T,
1430        edit_count: usize,
1431    ) -> (Vec<(Range<usize>, Arc<str>)>, Operation)
1432    where
1433        T: rand::Rng,
1434    {
1435        let mut edits: Vec<(Range<usize>, Arc<str>)> = Vec::new();
1436        let mut last_end = None;
1437        for _ in 0..edit_count {
1438            if last_end.map_or(false, |last_end| last_end >= self.len()) {
1439                break;
1440            }
1441            let new_start = last_end.map_or(0, |last_end| last_end + 1);
1442            let range = self.random_byte_range(new_start, rng);
1443            last_end = Some(range.end);
1444
1445            let new_text_len = rng.gen_range(0..10);
1446            let new_text: String = crate::random_char_iter::RandomCharIter::new(&mut *rng)
1447                .take(new_text_len)
1448                .collect();
1449
1450            edits.push((range, new_text.into()));
1451        }
1452
1453        log::info!("mutating buffer {} with {:?}", self.replica_id, edits);
1454        let op = self.edit(edits.iter().cloned());
1455        (edits, op)
1456    }
1457
1458    pub fn randomly_undo_redo(&mut self, rng: &mut impl rand::Rng) -> Vec<Operation> {
1459        use rand::prelude::*;
1460
1461        let mut ops = Vec::new();
1462        for _ in 0..rng.gen_range(1..=5) {
1463            if let Some(entry) = self.history.undo_stack.choose(rng) {
1464                let transaction = entry.transaction.clone();
1465                log::info!(
1466                    "undoing buffer {} transaction {:?}",
1467                    self.replica_id,
1468                    transaction
1469                );
1470                ops.push(self.undo_or_redo(transaction).unwrap());
1471            }
1472        }
1473        ops
1474    }
1475}
1476
1477impl Deref for Buffer {
1478    type Target = BufferSnapshot;
1479
1480    fn deref(&self) -> &Self::Target {
1481        &self.snapshot
1482    }
1483}
1484
1485impl BufferSnapshot {
1486    pub fn as_rope(&self) -> &Rope {
1487        &self.visible_text
1488    }
1489
1490    pub fn replica_id(&self) -> ReplicaId {
1491        self.replica_id
1492    }
1493
1494    pub fn row_count(&self) -> u32 {
1495        self.max_point().row + 1
1496    }
1497
1498    pub fn len(&self) -> usize {
1499        self.visible_text.len()
1500    }
1501
1502    pub fn chars(&self) -> impl Iterator<Item = char> + '_ {
1503        self.chars_at(0)
1504    }
1505
1506    pub fn chars_for_range<T: ToOffset>(&self, range: Range<T>) -> impl Iterator<Item = char> + '_ {
1507        self.text_for_range(range).flat_map(str::chars)
1508    }
1509
1510    pub fn contains_str_at<T>(&self, position: T, needle: &str) -> bool
1511    where
1512        T: ToOffset,
1513    {
1514        let position = position.to_offset(self);
1515        position == self.clip_offset(position, Bias::Left)
1516            && self
1517                .bytes_in_range(position..self.len())
1518                .flatten()
1519                .copied()
1520                .take(needle.len())
1521                .eq(needle.bytes())
1522    }
1523
1524    pub fn common_prefix_at<T>(&self, position: T, needle: &str) -> Range<T>
1525    where
1526        T: ToOffset + TextDimension,
1527    {
1528        let offset = position.to_offset(self);
1529        let common_prefix_len = needle
1530            .char_indices()
1531            .map(|(index, _)| index)
1532            .chain([needle.len()])
1533            .take_while(|&len| len <= offset)
1534            .filter(|&len| {
1535                let left = self
1536                    .chars_for_range(offset - len..offset)
1537                    .flat_map(|c| char::to_lowercase(c));
1538                let right = needle[..len].chars().flat_map(|c| char::to_lowercase(c));
1539                left.eq(right)
1540            })
1541            .last()
1542            .unwrap_or(0);
1543        let start_offset = offset - common_prefix_len;
1544        let start = self.text_summary_for_range(0..start_offset);
1545        start..position
1546    }
1547
1548    pub fn text(&self) -> String {
1549        self.visible_text.to_string()
1550    }
1551
1552    pub fn deleted_text(&self) -> String {
1553        self.deleted_text.to_string()
1554    }
1555
1556    pub fn fragments(&self) -> impl Iterator<Item = &Fragment> {
1557        self.fragments.iter()
1558    }
1559
1560    pub fn text_summary(&self) -> TextSummary {
1561        self.visible_text.summary()
1562    }
1563
1564    pub fn max_point(&self) -> Point {
1565        self.visible_text.max_point()
1566    }
1567
1568    pub fn max_point_utf16(&self) -> PointUtf16 {
1569        self.visible_text.max_point_utf16()
1570    }
1571
1572    pub fn point_to_offset(&self, point: Point) -> usize {
1573        self.visible_text.point_to_offset(point)
1574    }
1575
1576    pub fn point_utf16_to_offset(&self, point: PointUtf16) -> usize {
1577        self.visible_text.point_utf16_to_offset(point)
1578    }
1579
1580    pub fn point_utf16_to_point(&self, point: PointUtf16) -> Point {
1581        self.visible_text.point_utf16_to_point(point)
1582    }
1583
1584    pub fn offset_to_point(&self, offset: usize) -> Point {
1585        self.visible_text.offset_to_point(offset)
1586    }
1587
1588    pub fn offset_to_point_utf16(&self, offset: usize) -> PointUtf16 {
1589        self.visible_text.offset_to_point_utf16(offset)
1590    }
1591
1592    pub fn point_to_point_utf16(&self, point: Point) -> PointUtf16 {
1593        self.visible_text.point_to_point_utf16(point)
1594    }
1595
1596    pub fn version(&self) -> &clock::Global {
1597        &self.version
1598    }
1599
1600    pub fn chars_at<'a, T: ToOffset>(&'a self, position: T) -> impl Iterator<Item = char> + 'a {
1601        let offset = position.to_offset(self);
1602        self.visible_text.chars_at(offset)
1603    }
1604
1605    pub fn reversed_chars_at<'a, T: ToOffset>(
1606        &'a self,
1607        position: T,
1608    ) -> impl Iterator<Item = char> + 'a {
1609        let offset = position.to_offset(self);
1610        self.visible_text.reversed_chars_at(offset)
1611    }
1612
1613    pub fn reversed_chunks_in_range<T: ToOffset>(&self, range: Range<T>) -> rope::Chunks {
1614        let range = range.start.to_offset(self)..range.end.to_offset(self);
1615        self.visible_text.reversed_chunks_in_range(range)
1616    }
1617
1618    pub fn bytes_in_range<'a, T: ToOffset>(&'a self, range: Range<T>) -> rope::Bytes<'a> {
1619        let start = range.start.to_offset(self);
1620        let end = range.end.to_offset(self);
1621        self.visible_text.bytes_in_range(start..end)
1622    }
1623
1624    pub fn text_for_range<'a, T: ToOffset>(&'a self, range: Range<T>) -> Chunks<'a> {
1625        let start = range.start.to_offset(self);
1626        let end = range.end.to_offset(self);
1627        self.visible_text.chunks_in_range(start..end)
1628    }
1629
1630    pub fn line_len(&self, row: u32) -> u32 {
1631        let row_start_offset = Point::new(row, 0).to_offset(self);
1632        let row_end_offset = if row >= self.max_point().row {
1633            self.len()
1634        } else {
1635            Point::new(row + 1, 0).to_offset(self) - 1
1636        };
1637        (row_end_offset - row_start_offset) as u32
1638    }
1639
1640    pub fn is_line_blank(&self, row: u32) -> bool {
1641        self.text_for_range(Point::new(row, 0)..Point::new(row, self.line_len(row)))
1642            .all(|chunk| chunk.matches(|c: char| !c.is_whitespace()).next().is_none())
1643    }
1644
1645    pub fn text_summary_for_range<'a, D, O: ToOffset>(&'a self, range: Range<O>) -> D
1646    where
1647        D: TextDimension,
1648    {
1649        self.visible_text
1650            .cursor(range.start.to_offset(self))
1651            .summary(range.end.to_offset(self))
1652    }
1653
1654    pub fn summaries_for_anchors<'a, D, A>(&'a self, anchors: A) -> impl 'a + Iterator<Item = D>
1655    where
1656        D: 'a + TextDimension,
1657        A: 'a + IntoIterator<Item = &'a Anchor>,
1658    {
1659        let anchors = anchors.into_iter();
1660        let mut insertion_cursor = self.insertions.cursor::<InsertionFragmentKey>();
1661        let mut fragment_cursor = self.fragments.cursor::<(Option<&Locator>, usize)>();
1662        let mut text_cursor = self.visible_text.cursor(0);
1663        let mut position = D::default();
1664
1665        anchors.map(move |anchor| {
1666            if *anchor == Anchor::MIN {
1667                return D::default();
1668            } else if *anchor == Anchor::MAX {
1669                return D::from_text_summary(&self.visible_text.summary());
1670            }
1671
1672            let anchor_key = InsertionFragmentKey {
1673                timestamp: anchor.timestamp,
1674                split_offset: anchor.offset,
1675            };
1676            insertion_cursor.seek(&anchor_key, anchor.bias, &());
1677            if let Some(insertion) = insertion_cursor.item() {
1678                let comparison = sum_tree::KeyedItem::key(insertion).cmp(&anchor_key);
1679                if comparison == Ordering::Greater
1680                    || (anchor.bias == Bias::Left
1681                        && comparison == Ordering::Equal
1682                        && anchor.offset > 0)
1683                {
1684                    insertion_cursor.prev(&());
1685                }
1686            } else {
1687                insertion_cursor.prev(&());
1688            }
1689            let insertion = insertion_cursor.item().expect("invalid insertion");
1690            assert_eq!(insertion.timestamp, anchor.timestamp, "invalid insertion");
1691
1692            fragment_cursor.seek_forward(&Some(&insertion.fragment_id), Bias::Left, &None);
1693            let fragment = fragment_cursor.item().unwrap();
1694            let mut fragment_offset = fragment_cursor.start().1;
1695            if fragment.visible {
1696                fragment_offset += anchor.offset - insertion.split_offset;
1697            }
1698
1699            position.add_assign(&text_cursor.summary(fragment_offset));
1700            position.clone()
1701        })
1702    }
1703
1704    fn summary_for_anchor<'a, D>(&'a self, anchor: &Anchor) -> D
1705    where
1706        D: TextDimension,
1707    {
1708        if *anchor == Anchor::MIN {
1709            D::default()
1710        } else if *anchor == Anchor::MAX {
1711            D::from_text_summary(&self.visible_text.summary())
1712        } else {
1713            let anchor_key = InsertionFragmentKey {
1714                timestamp: anchor.timestamp,
1715                split_offset: anchor.offset,
1716            };
1717            let mut insertion_cursor = self.insertions.cursor::<InsertionFragmentKey>();
1718            insertion_cursor.seek(&anchor_key, anchor.bias, &());
1719            if let Some(insertion) = insertion_cursor.item() {
1720                let comparison = sum_tree::KeyedItem::key(insertion).cmp(&anchor_key);
1721                if comparison == Ordering::Greater
1722                    || (anchor.bias == Bias::Left
1723                        && comparison == Ordering::Equal
1724                        && anchor.offset > 0)
1725                {
1726                    insertion_cursor.prev(&());
1727                }
1728            } else {
1729                insertion_cursor.prev(&());
1730            }
1731            let insertion = insertion_cursor.item().expect("invalid insertion");
1732            assert_eq!(insertion.timestamp, anchor.timestamp, "invalid insertion");
1733
1734            let mut fragment_cursor = self.fragments.cursor::<(Option<&Locator>, usize)>();
1735            fragment_cursor.seek(&Some(&insertion.fragment_id), Bias::Left, &None);
1736            let fragment = fragment_cursor.item().unwrap();
1737            let mut fragment_offset = fragment_cursor.start().1;
1738            if fragment.visible {
1739                fragment_offset += anchor.offset - insertion.split_offset;
1740            }
1741            self.text_summary_for_range(0..fragment_offset)
1742        }
1743    }
1744
1745    fn fragment_id_for_anchor(&self, anchor: &Anchor) -> &Locator {
1746        if *anchor == Anchor::MIN {
1747            &locator::MIN
1748        } else if *anchor == Anchor::MAX {
1749            &locator::MAX
1750        } else {
1751            let anchor_key = InsertionFragmentKey {
1752                timestamp: anchor.timestamp,
1753                split_offset: anchor.offset,
1754            };
1755            let mut insertion_cursor = self.insertions.cursor::<InsertionFragmentKey>();
1756            insertion_cursor.seek(&anchor_key, anchor.bias, &());
1757            if let Some(insertion) = insertion_cursor.item() {
1758                let comparison = sum_tree::KeyedItem::key(insertion).cmp(&anchor_key);
1759                if comparison == Ordering::Greater
1760                    || (anchor.bias == Bias::Left
1761                        && comparison == Ordering::Equal
1762                        && anchor.offset > 0)
1763                {
1764                    insertion_cursor.prev(&());
1765                }
1766            } else {
1767                insertion_cursor.prev(&());
1768            }
1769            let insertion = insertion_cursor.item().expect("invalid insertion");
1770            debug_assert_eq!(insertion.timestamp, anchor.timestamp, "invalid insertion");
1771            &insertion.fragment_id
1772        }
1773    }
1774
1775    pub fn anchor_before<T: ToOffset>(&self, position: T) -> Anchor {
1776        self.anchor_at(position, Bias::Left)
1777    }
1778
1779    pub fn anchor_after<T: ToOffset>(&self, position: T) -> Anchor {
1780        self.anchor_at(position, Bias::Right)
1781    }
1782
1783    pub fn anchor_at<T: ToOffset>(&self, position: T, bias: Bias) -> Anchor {
1784        let offset = position.to_offset(self);
1785        if bias == Bias::Left && offset == 0 {
1786            Anchor::MIN
1787        } else if bias == Bias::Right && offset == self.len() {
1788            Anchor::MAX
1789        } else {
1790            let mut fragment_cursor = self.fragments.cursor::<usize>();
1791            fragment_cursor.seek(&offset, bias, &None);
1792            let fragment = fragment_cursor.item().unwrap();
1793            let overshoot = offset - *fragment_cursor.start();
1794            Anchor {
1795                timestamp: fragment.insertion_timestamp.local(),
1796                offset: fragment.insertion_offset + overshoot,
1797                bias,
1798                buffer_id: Some(self.remote_id),
1799            }
1800        }
1801    }
1802
1803    pub fn can_resolve(&self, anchor: &Anchor) -> bool {
1804        *anchor == Anchor::MIN
1805            || *anchor == Anchor::MAX
1806            || (Some(self.remote_id) == anchor.buffer_id && self.version.observed(anchor.timestamp))
1807    }
1808
1809    pub fn clip_offset(&self, offset: usize, bias: Bias) -> usize {
1810        self.visible_text.clip_offset(offset, bias)
1811    }
1812
1813    pub fn clip_point(&self, point: Point, bias: Bias) -> Point {
1814        self.visible_text.clip_point(point, bias)
1815    }
1816
1817    pub fn clip_point_utf16(&self, point: PointUtf16, bias: Bias) -> PointUtf16 {
1818        self.visible_text.clip_point_utf16(point, bias)
1819    }
1820
1821    pub fn edits_since<'a, D>(
1822        &'a self,
1823        since: &'a clock::Global,
1824    ) -> impl 'a + Iterator<Item = Edit<D>>
1825    where
1826        D: TextDimension + Ord,
1827    {
1828        self.edits_since_in_range(since, Anchor::MIN..Anchor::MAX)
1829    }
1830
1831    pub fn edited_ranges_for_transaction<'a, D>(
1832        &'a self,
1833        transaction: &'a Transaction,
1834    ) -> impl 'a + Iterator<Item = Range<D>>
1835    where
1836        D: TextDimension,
1837    {
1838        let mut cursor = self.fragments.cursor::<(VersionedFullOffset, usize)>();
1839        let mut rope_cursor = self.visible_text.cursor(0);
1840        let cx = Some(transaction.end.clone());
1841        let mut position = D::default();
1842        transaction.ranges.iter().map(move |range| {
1843            cursor.seek_forward(&VersionedFullOffset::Offset(range.start), Bias::Right, &cx);
1844            let mut start_offset = cursor.start().1;
1845            if cursor
1846                .item()
1847                .map_or(false, |fragment| fragment.is_visible(&self.undo_map))
1848            {
1849                start_offset += range.start - cursor.start().0.full_offset()
1850            }
1851            position.add_assign(&rope_cursor.summary(start_offset));
1852            let start = position.clone();
1853
1854            cursor.seek_forward(&VersionedFullOffset::Offset(range.end), Bias::Left, &cx);
1855            let mut end_offset = cursor.start().1;
1856            if cursor
1857                .item()
1858                .map_or(false, |fragment| fragment.is_visible(&self.undo_map))
1859            {
1860                end_offset += range.end - cursor.start().0.full_offset();
1861            }
1862            position.add_assign(&rope_cursor.summary(end_offset));
1863            start..position.clone()
1864        })
1865    }
1866
1867    pub fn edits_since_in_range<'a, D>(
1868        &'a self,
1869        since: &'a clock::Global,
1870        range: Range<Anchor>,
1871    ) -> impl 'a + Iterator<Item = Edit<D>>
1872    where
1873        D: TextDimension + Ord,
1874    {
1875        let fragments_cursor = if *since == self.version {
1876            None
1877        } else {
1878            let mut cursor = self
1879                .fragments
1880                .filter(move |summary| !since.observed_all(&summary.max_version));
1881            cursor.next(&None);
1882            Some(cursor)
1883        };
1884        let mut cursor = self
1885            .fragments
1886            .cursor::<(Option<&Locator>, FragmentTextSummary)>();
1887
1888        let start_fragment_id = self.fragment_id_for_anchor(&range.start);
1889        cursor.seek(&Some(start_fragment_id), Bias::Left, &None);
1890        let mut visible_start = cursor.start().1.visible;
1891        let mut deleted_start = cursor.start().1.deleted;
1892        if let Some(fragment) = cursor.item() {
1893            let overshoot = range.start.offset - fragment.insertion_offset;
1894            if fragment.visible {
1895                visible_start += overshoot;
1896            } else {
1897                deleted_start += overshoot;
1898            }
1899        }
1900        let end_fragment_id = self.fragment_id_for_anchor(&range.end);
1901
1902        Edits {
1903            visible_cursor: self.visible_text.cursor(visible_start),
1904            deleted_cursor: self.deleted_text.cursor(deleted_start),
1905            fragments_cursor,
1906            undos: &self.undo_map,
1907            since,
1908            old_end: Default::default(),
1909            new_end: Default::default(),
1910            range: (start_fragment_id, range.start.offset)..(end_fragment_id, range.end.offset),
1911        }
1912    }
1913}
1914
1915struct RopeBuilder<'a> {
1916    old_visible_cursor: rope::Cursor<'a>,
1917    old_deleted_cursor: rope::Cursor<'a>,
1918    new_visible: Rope,
1919    new_deleted: Rope,
1920}
1921
1922impl<'a> RopeBuilder<'a> {
1923    fn new(old_visible_cursor: rope::Cursor<'a>, old_deleted_cursor: rope::Cursor<'a>) -> Self {
1924        Self {
1925            old_visible_cursor,
1926            old_deleted_cursor,
1927            new_visible: Rope::new(),
1928            new_deleted: Rope::new(),
1929        }
1930    }
1931
1932    fn push_tree(&mut self, len: FragmentTextSummary) {
1933        self.push(len.visible, true, true);
1934        self.push(len.deleted, false, false);
1935    }
1936
1937    fn push_fragment(&mut self, fragment: &Fragment, was_visible: bool) {
1938        debug_assert!(fragment.len > 0);
1939        self.push(fragment.len, was_visible, fragment.visible)
1940    }
1941
1942    fn push(&mut self, len: usize, was_visible: bool, is_visible: bool) {
1943        let text = if was_visible {
1944            self.old_visible_cursor
1945                .slice(self.old_visible_cursor.offset() + len)
1946        } else {
1947            self.old_deleted_cursor
1948                .slice(self.old_deleted_cursor.offset() + len)
1949        };
1950        if is_visible {
1951            self.new_visible.append(text);
1952        } else {
1953            self.new_deleted.append(text);
1954        }
1955    }
1956
1957    fn push_str(&mut self, text: &str) {
1958        self.new_visible.push(text);
1959    }
1960
1961    fn finish(mut self) -> (Rope, Rope) {
1962        self.new_visible.append(self.old_visible_cursor.suffix());
1963        self.new_deleted.append(self.old_deleted_cursor.suffix());
1964        (self.new_visible, self.new_deleted)
1965    }
1966}
1967
1968impl<'a, D: TextDimension + Ord, F: FnMut(&FragmentSummary) -> bool> Iterator for Edits<'a, D, F> {
1969    type Item = Edit<D>;
1970
1971    fn next(&mut self) -> Option<Self::Item> {
1972        let mut pending_edit: Option<Edit<D>> = None;
1973        let cursor = self.fragments_cursor.as_mut()?;
1974
1975        while let Some(fragment) = cursor.item() {
1976            if fragment.id < *self.range.start.0 {
1977                cursor.next(&None);
1978                continue;
1979            } else if fragment.id > *self.range.end.0 {
1980                break;
1981            }
1982
1983            if cursor.start().visible > self.visible_cursor.offset() {
1984                let summary = self.visible_cursor.summary(cursor.start().visible);
1985                self.old_end.add_assign(&summary);
1986                self.new_end.add_assign(&summary);
1987            }
1988
1989            if pending_edit
1990                .as_ref()
1991                .map_or(false, |change| change.new.end < self.new_end)
1992            {
1993                break;
1994            }
1995
1996            if !fragment.was_visible(&self.since, &self.undos) && fragment.visible {
1997                let mut visible_end = cursor.end(&None).visible;
1998                if fragment.id == *self.range.end.0 {
1999                    visible_end = cmp::min(
2000                        visible_end,
2001                        cursor.start().visible + (self.range.end.1 - fragment.insertion_offset),
2002                    );
2003                }
2004
2005                let fragment_summary = self.visible_cursor.summary(visible_end);
2006                let mut new_end = self.new_end.clone();
2007                new_end.add_assign(&fragment_summary);
2008                if let Some(pending_edit) = pending_edit.as_mut() {
2009                    pending_edit.new.end = new_end.clone();
2010                } else {
2011                    pending_edit = Some(Edit {
2012                        old: self.old_end.clone()..self.old_end.clone(),
2013                        new: self.new_end.clone()..new_end.clone(),
2014                    });
2015                }
2016
2017                self.new_end = new_end;
2018            } else if fragment.was_visible(&self.since, &self.undos) && !fragment.visible {
2019                let mut deleted_end = cursor.end(&None).deleted;
2020                if fragment.id == *self.range.end.0 {
2021                    deleted_end = cmp::min(
2022                        deleted_end,
2023                        cursor.start().deleted + (self.range.end.1 - fragment.insertion_offset),
2024                    );
2025                }
2026
2027                if cursor.start().deleted > self.deleted_cursor.offset() {
2028                    self.deleted_cursor.seek_forward(cursor.start().deleted);
2029                }
2030                let fragment_summary = self.deleted_cursor.summary(deleted_end);
2031                let mut old_end = self.old_end.clone();
2032                old_end.add_assign(&fragment_summary);
2033                if let Some(pending_edit) = pending_edit.as_mut() {
2034                    pending_edit.old.end = old_end.clone();
2035                } else {
2036                    pending_edit = Some(Edit {
2037                        old: self.old_end.clone()..old_end.clone(),
2038                        new: self.new_end.clone()..self.new_end.clone(),
2039                    });
2040                }
2041
2042                self.old_end = old_end;
2043            }
2044
2045            cursor.next(&None);
2046        }
2047
2048        pending_edit
2049    }
2050}
2051
2052impl Fragment {
2053    fn is_visible(&self, undos: &UndoMap) -> bool {
2054        !undos.is_undone(self.insertion_timestamp.local())
2055            && self.deletions.iter().all(|d| undos.is_undone(*d))
2056    }
2057
2058    fn was_visible(&self, version: &clock::Global, undos: &UndoMap) -> bool {
2059        (version.observed(self.insertion_timestamp.local())
2060            && !undos.was_undone(self.insertion_timestamp.local(), version))
2061            && self
2062                .deletions
2063                .iter()
2064                .all(|d| !version.observed(*d) || undos.was_undone(*d, version))
2065    }
2066}
2067
2068impl sum_tree::Item for Fragment {
2069    type Summary = FragmentSummary;
2070
2071    fn summary(&self) -> Self::Summary {
2072        let mut max_version = clock::Global::new();
2073        max_version.observe(self.insertion_timestamp.local());
2074        for deletion in &self.deletions {
2075            max_version.observe(*deletion);
2076        }
2077        max_version.join(&self.max_undos);
2078
2079        let mut min_insertion_version = clock::Global::new();
2080        min_insertion_version.observe(self.insertion_timestamp.local());
2081        let max_insertion_version = min_insertion_version.clone();
2082        if self.visible {
2083            FragmentSummary {
2084                max_id: self.id.clone(),
2085                text: FragmentTextSummary {
2086                    visible: self.len,
2087                    deleted: 0,
2088                },
2089                max_version,
2090                min_insertion_version,
2091                max_insertion_version,
2092            }
2093        } else {
2094            FragmentSummary {
2095                max_id: self.id.clone(),
2096                text: FragmentTextSummary {
2097                    visible: 0,
2098                    deleted: self.len,
2099                },
2100                max_version,
2101                min_insertion_version,
2102                max_insertion_version,
2103            }
2104        }
2105    }
2106}
2107
2108impl sum_tree::Summary for FragmentSummary {
2109    type Context = Option<clock::Global>;
2110
2111    fn add_summary(&mut self, other: &Self, _: &Self::Context) {
2112        self.max_id.assign(&other.max_id);
2113        self.text.visible += &other.text.visible;
2114        self.text.deleted += &other.text.deleted;
2115        self.max_version.join(&other.max_version);
2116        self.min_insertion_version
2117            .meet(&other.min_insertion_version);
2118        self.max_insertion_version
2119            .join(&other.max_insertion_version);
2120    }
2121}
2122
2123impl Default for FragmentSummary {
2124    fn default() -> Self {
2125        FragmentSummary {
2126            max_id: Locator::min(),
2127            text: FragmentTextSummary::default(),
2128            max_version: clock::Global::new(),
2129            min_insertion_version: clock::Global::new(),
2130            max_insertion_version: clock::Global::new(),
2131        }
2132    }
2133}
2134
2135impl sum_tree::Item for InsertionFragment {
2136    type Summary = InsertionFragmentKey;
2137
2138    fn summary(&self) -> Self::Summary {
2139        InsertionFragmentKey {
2140            timestamp: self.timestamp,
2141            split_offset: self.split_offset,
2142        }
2143    }
2144}
2145
2146impl sum_tree::KeyedItem for InsertionFragment {
2147    type Key = InsertionFragmentKey;
2148
2149    fn key(&self) -> Self::Key {
2150        sum_tree::Item::summary(self)
2151    }
2152}
2153
2154impl InsertionFragment {
2155    fn new(fragment: &Fragment) -> Self {
2156        Self {
2157            timestamp: fragment.insertion_timestamp.local(),
2158            split_offset: fragment.insertion_offset,
2159            fragment_id: fragment.id.clone(),
2160        }
2161    }
2162
2163    fn insert_new(fragment: &Fragment) -> sum_tree::Edit<Self> {
2164        sum_tree::Edit::Insert(Self::new(fragment))
2165    }
2166}
2167
2168impl sum_tree::Summary for InsertionFragmentKey {
2169    type Context = ();
2170
2171    fn add_summary(&mut self, summary: &Self, _: &()) {
2172        *self = *summary;
2173    }
2174}
2175
2176#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
2177pub struct FullOffset(pub usize);
2178
2179impl ops::AddAssign<usize> for FullOffset {
2180    fn add_assign(&mut self, rhs: usize) {
2181        self.0 += rhs;
2182    }
2183}
2184
2185impl ops::Add<usize> for FullOffset {
2186    type Output = Self;
2187
2188    fn add(mut self, rhs: usize) -> Self::Output {
2189        self += rhs;
2190        self
2191    }
2192}
2193
2194impl ops::Sub for FullOffset {
2195    type Output = usize;
2196
2197    fn sub(self, rhs: Self) -> Self::Output {
2198        self.0 - rhs.0
2199    }
2200}
2201
2202impl<'a> sum_tree::Dimension<'a, FragmentSummary> for usize {
2203    fn add_summary(&mut self, summary: &FragmentSummary, _: &Option<clock::Global>) {
2204        *self += summary.text.visible;
2205    }
2206}
2207
2208impl<'a> sum_tree::Dimension<'a, FragmentSummary> for FullOffset {
2209    fn add_summary(&mut self, summary: &FragmentSummary, _: &Option<clock::Global>) {
2210        self.0 += summary.text.visible + summary.text.deleted;
2211    }
2212}
2213
2214impl<'a> sum_tree::Dimension<'a, FragmentSummary> for Option<&'a Locator> {
2215    fn add_summary(&mut self, summary: &'a FragmentSummary, _: &Option<clock::Global>) {
2216        *self = Some(&summary.max_id);
2217    }
2218}
2219
2220impl<'a> sum_tree::SeekTarget<'a, FragmentSummary, FragmentTextSummary> for usize {
2221    fn cmp(
2222        &self,
2223        cursor_location: &FragmentTextSummary,
2224        _: &Option<clock::Global>,
2225    ) -> cmp::Ordering {
2226        Ord::cmp(self, &cursor_location.visible)
2227    }
2228}
2229
2230#[derive(Copy, Clone, Debug, Eq, PartialEq)]
2231enum VersionedFullOffset {
2232    Offset(FullOffset),
2233    Invalid,
2234}
2235
2236impl VersionedFullOffset {
2237    fn full_offset(&self) -> FullOffset {
2238        if let Self::Offset(position) = self {
2239            *position
2240        } else {
2241            panic!("invalid version")
2242        }
2243    }
2244}
2245
2246impl Default for VersionedFullOffset {
2247    fn default() -> Self {
2248        Self::Offset(Default::default())
2249    }
2250}
2251
2252impl<'a> sum_tree::Dimension<'a, FragmentSummary> for VersionedFullOffset {
2253    fn add_summary(&mut self, summary: &'a FragmentSummary, cx: &Option<clock::Global>) {
2254        if let Self::Offset(offset) = self {
2255            let version = cx.as_ref().unwrap();
2256            if version.observed_all(&summary.max_insertion_version) {
2257                *offset += summary.text.visible + summary.text.deleted;
2258            } else if version.observed_any(&summary.min_insertion_version) {
2259                *self = Self::Invalid;
2260            }
2261        }
2262    }
2263}
2264
2265impl<'a> sum_tree::SeekTarget<'a, FragmentSummary, Self> for VersionedFullOffset {
2266    fn cmp(&self, cursor_position: &Self, _: &Option<clock::Global>) -> cmp::Ordering {
2267        match (self, cursor_position) {
2268            (Self::Offset(a), Self::Offset(b)) => Ord::cmp(a, b),
2269            (Self::Offset(_), Self::Invalid) => cmp::Ordering::Less,
2270            (Self::Invalid, _) => unreachable!(),
2271        }
2272    }
2273}
2274
2275impl Operation {
2276    fn replica_id(&self) -> ReplicaId {
2277        operation_queue::Operation::lamport_timestamp(self).replica_id
2278    }
2279
2280    pub fn local_timestamp(&self) -> clock::Local {
2281        match self {
2282            Operation::Edit(edit) => edit.timestamp.local(),
2283            Operation::Undo { undo, .. } => undo.id,
2284        }
2285    }
2286
2287    pub fn as_edit(&self) -> Option<&EditOperation> {
2288        match self {
2289            Operation::Edit(edit) => Some(edit),
2290            _ => None,
2291        }
2292    }
2293
2294    pub fn is_edit(&self) -> bool {
2295        match self {
2296            Operation::Edit { .. } => true,
2297            _ => false,
2298        }
2299    }
2300}
2301
2302impl operation_queue::Operation for Operation {
2303    fn lamport_timestamp(&self) -> clock::Lamport {
2304        match self {
2305            Operation::Edit(edit) => edit.timestamp.lamport(),
2306            Operation::Undo {
2307                lamport_timestamp, ..
2308            } => *lamport_timestamp,
2309        }
2310    }
2311}
2312
2313pub trait ToOffset {
2314    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize;
2315}
2316
2317impl ToOffset for Point {
2318    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize {
2319        snapshot.point_to_offset(*self)
2320    }
2321}
2322
2323impl ToOffset for PointUtf16 {
2324    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize {
2325        snapshot.point_utf16_to_offset(*self)
2326    }
2327}
2328
2329impl ToOffset for usize {
2330    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize {
2331        assert!(*self <= snapshot.len(), "offset is out of range");
2332        *self
2333    }
2334}
2335
2336impl ToOffset for Anchor {
2337    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize {
2338        snapshot.summary_for_anchor(self)
2339    }
2340}
2341
2342impl<'a, T: ToOffset> ToOffset for &'a T {
2343    fn to_offset(&self, content: &BufferSnapshot) -> usize {
2344        (*self).to_offset(content)
2345    }
2346}
2347
2348pub trait ToPoint {
2349    fn to_point<'a>(&self, snapshot: &BufferSnapshot) -> Point;
2350}
2351
2352impl ToPoint for Anchor {
2353    fn to_point<'a>(&self, snapshot: &BufferSnapshot) -> Point {
2354        snapshot.summary_for_anchor(self)
2355    }
2356}
2357
2358impl ToPoint for usize {
2359    fn to_point<'a>(&self, snapshot: &BufferSnapshot) -> Point {
2360        snapshot.offset_to_point(*self)
2361    }
2362}
2363
2364impl ToPoint for PointUtf16 {
2365    fn to_point<'a>(&self, snapshot: &BufferSnapshot) -> Point {
2366        snapshot.point_utf16_to_point(*self)
2367    }
2368}
2369
2370impl ToPoint for Point {
2371    fn to_point<'a>(&self, _: &BufferSnapshot) -> Point {
2372        *self
2373    }
2374}
2375
2376pub trait ToPointUtf16 {
2377    fn to_point_utf16<'a>(&self, snapshot: &BufferSnapshot) -> PointUtf16;
2378}
2379
2380impl ToPointUtf16 for Anchor {
2381    fn to_point_utf16<'a>(&self, snapshot: &BufferSnapshot) -> PointUtf16 {
2382        snapshot.summary_for_anchor(self)
2383    }
2384}
2385
2386impl ToPointUtf16 for usize {
2387    fn to_point_utf16<'a>(&self, snapshot: &BufferSnapshot) -> PointUtf16 {
2388        snapshot.offset_to_point_utf16(*self)
2389    }
2390}
2391
2392impl ToPointUtf16 for PointUtf16 {
2393    fn to_point_utf16<'a>(&self, _: &BufferSnapshot) -> PointUtf16 {
2394        *self
2395    }
2396}
2397
2398impl ToPointUtf16 for Point {
2399    fn to_point_utf16<'a>(&self, snapshot: &BufferSnapshot) -> PointUtf16 {
2400        snapshot.point_to_point_utf16(*self)
2401    }
2402}
2403
2404pub trait Clip {
2405    fn clip(&self, bias: Bias, snapshot: &BufferSnapshot) -> Self;
2406}
2407
2408impl Clip for usize {
2409    fn clip(&self, bias: Bias, snapshot: &BufferSnapshot) -> Self {
2410        snapshot.clip_offset(*self, bias)
2411    }
2412}
2413
2414impl Clip for Point {
2415    fn clip(&self, bias: Bias, snapshot: &BufferSnapshot) -> Self {
2416        snapshot.clip_point(*self, bias)
2417    }
2418}
2419
2420impl Clip for PointUtf16 {
2421    fn clip(&self, bias: Bias, snapshot: &BufferSnapshot) -> Self {
2422        snapshot.clip_point_utf16(*self, bias)
2423    }
2424}
2425
2426pub trait FromAnchor {
2427    fn from_anchor(anchor: &Anchor, snapshot: &BufferSnapshot) -> Self;
2428}
2429
2430impl FromAnchor for Point {
2431    fn from_anchor(anchor: &Anchor, snapshot: &BufferSnapshot) -> Self {
2432        snapshot.summary_for_anchor(anchor)
2433    }
2434}
2435
2436impl FromAnchor for PointUtf16 {
2437    fn from_anchor(anchor: &Anchor, snapshot: &BufferSnapshot) -> Self {
2438        snapshot.summary_for_anchor(anchor)
2439    }
2440}
2441
2442impl FromAnchor for usize {
2443    fn from_anchor(anchor: &Anchor, snapshot: &BufferSnapshot) -> Self {
2444        snapshot.summary_for_anchor(anchor)
2445    }
2446}