From a3f321a531554b51160f3fe7e6da1c269030f3b6 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Wed, 23 Nov 2022 13:02:00 -0600 Subject: Follow parent links when calculating changes since a revision The 'revisions' field on History can't be treated as linear: each Revision in the revisions Vec has a parent link and an optional child link. We can follow those to unroll the recent history. --- helix-core/src/history.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'helix-core') diff --git a/helix-core/src/history.rs b/helix-core/src/history.rs index 5f9fa71e..82509242 100644 --- a/helix-core/src/history.rs +++ b/helix-core/src/history.rs @@ -126,16 +126,27 @@ impl History { match revision.cmp(&self.current) { Equal => None, - Greater => self.revisions[self.current + 1..=revision] - .iter() - .map(|revision| &revision.inversion) - .cloned() - .reduce(|acc, inversion| acc.compose(inversion)), - Less => self.revisions[revision + 1..=self.current] - .iter() - .map(|revision| &revision.transaction) - .cloned() - .reduce(|acc, transaction| acc.compose(transaction)), + Less => { + let mut child = self.revisions[revision].last_child?.get(); + let mut transaction = self.revisions[child].transaction.clone(); + while child != self.current { + child = self.revisions[child].last_child?.get(); + transaction = transaction.compose(self.revisions[child].transaction.clone()); + } + Some(transaction) + } + Greater => { + let mut inversion = self.revisions[revision].inversion.clone(); + let mut parent = self.revisions[revision].parent; + while parent != self.current { + parent = self.revisions[parent].parent; + if parent == 0 { + return None; + } + inversion = inversion.compose(self.revisions[parent].inversion.clone()); + } + Some(inversion) + } } } -- cgit v1.2.3-70-g09d2