From cc64c1d80bfbd6e4126918ff40f51e6845b78df3 Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Fri, 25 Nov 2022 11:51:55 +0100 Subject: [PATCH] cob: Use semilattice rules for commenting Signed-off-by: Alexis Sellier --- radicle/src/cob/thread.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/radicle/src/cob/thread.rs b/radicle/src/cob/thread.rs index b884b247..f2300b4e 100644 --- a/radicle/src/cob/thread.rs +++ b/radicle/src/cob/thread.rs @@ -1,3 +1,4 @@ +use std::collections::btree_map::Entry; use std::collections::BTreeMap; use std::ops::{ControlFlow, Deref, DerefMut}; use std::str::FromStr; @@ -121,22 +122,22 @@ impl Thread { match change.action { Action::Comment { comment } => { - match self.comments.get(&id) { - Some(Redactable::Present(_)) => { - // Do nothing, the action was already processed, - // since a change with the same content-id as this - // one exists already. + let present = Redactable::Present(comment); + + match self.comments.entry(id) { + Entry::Vacant(e) => { + e.insert(present); } - Some(Redactable::Redacted) => { - // Do nothing, the action was redacted. - } - None => { - self.comments.insert(id, Redactable::Present(comment)); + Entry::Occupied(mut e) => { + e.get_mut().merge(present); } } } Action::Redact { id } => { - self.comments.insert(id, Redactable::Redacted); + self.comments + .entry(id) + .and_modify(|e| e.merge(Redactable::Redacted)) + .or_insert(Redactable::Redacted); } Action::Tag { tag } => { self.tags