From 114ea2309e3fc03b683a992a73aa9944c80d7de5 Mon Sep 17 00:00:00 2001 From: Francesco Magliocca Date: Mon, 9 Nov 2020 21:06:05 +0100 Subject: [PATCH] Make update interface slightly more usable --- src/versioned_canvas.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/versioned_canvas.rs b/src/versioned_canvas.rs index e549baa..546f766 100644 --- a/src/versioned_canvas.rs +++ b/src/versioned_canvas.rs @@ -45,7 +45,7 @@ impl VersionedCanvas { } } - pub fn update(&mut self, update_fn: impl FnOnce(&Canvas) -> Canvas) { + pub fn update(&mut self, update_fn: impl FnOnce(&mut Canvas)) { // This is a linear history, // so we first check if there are newer versions, if so // this means we are in the past, so a change in the past destroys the future @@ -53,9 +53,15 @@ impl VersionedCanvas { if self.has_newer_versions() { self.versions = self.versions.take(self.curr_version + 1); } - let new_version = update_fn(self.get()); - self.versions.push_back(new_version); - self.curr_version = self.curr_version + 1; + + let mut new_version = self.get().clone(); + update_fn(&mut new_version); + + // Only push new version if there has been an actual change in the vector + if !new_version.elements.ptr_eq(&self.get().elements) { + self.versions.push_back(new_version); + self.curr_version = self.curr_version + 1; + } } // Do inplace update, which will be irreversible