Implement Ord manually for time::Lamport

Max Brunsfeld created

Change summary

zed/src/time.rs | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

Detailed changes

zed/src/time.rs 🔗

@@ -15,7 +15,7 @@ pub struct Local {
     pub value: Seq,
 }
 
-#[derive(Clone, Copy, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
+#[derive(Clone, Copy, Default, Eq, Hash, PartialEq)]
 pub struct Lamport {
     pub replica_id: ReplicaId,
     pub value: Seq,
@@ -139,6 +139,21 @@ impl PartialOrd for Global {
     }
 }
 
+impl Ord for Lamport {
+    fn cmp(&self, other: &Self) -> Ordering {
+        // Use the replica id to break ties between concurrent events.
+        self.value
+            .cmp(&other.value)
+            .then_with(|| self.replica_id.cmp(&other.replica_id))
+    }
+}
+
+impl PartialOrd for Lamport {
+    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
+        Some(self.cmp(other))
+    }
+}
+
 impl Lamport {
     pub fn new(replica_id: ReplicaId) -> Self {
         Self {