[−][src]Struct crdts::lwwreg::LWWReg
LWWReg
is a simple CRDT that contains an arbitrary value
along with an Ord
that tracks causality. It is the responsibility
of the user to guarantee that the source of the causal element
is monotonic. Don't use timestamps unless you are comfortable
with divergence.
M
is a marker. It must grow monotonically and must be globally unique
Fields
val: V
val
is the opaque element contained within this CRDT
marker: M
marker
should be a monotonic value associated with this val
Implementations
impl<V: PartialEq, M: Ord> LWWReg<V, M>
[src]
pub fn update(&mut self, val: V, marker: M) -> Result<(), Error>
[src]
Updates value witnessed by the given marker. An Err is returned if the given marker is exactly equal to the current marker
use crdts::LWWReg; let mut reg = LWWReg { val: 1, marker: 2 }; // updating with a smaller marker is a no-op assert!(reg.update(2, 1).is_ok()); assert_eq!(reg.val, 1); // updating with existing marker fails assert!(reg.update(2, 2).is_err()); assert_eq!(reg, LWWReg { val: 1, marker: 2 }); // updating with same val and marker succeeds assert!(reg.update(1, 2).is_ok()); assert_eq!(reg, LWWReg { val: 1, marker: 2 }); // updating with descendent marker succeeds assert!(reg.update(2, 3).is_ok()); assert_eq!(reg, LWWReg { val: 2, marker: 3 });
Trait Implementations
impl<V: Clone, M: Clone> Clone for LWWReg<V, M>
[src]
impl<V: Debug, M: Debug> Debug for LWWReg<V, M>
[src]
impl<V: Default, M: Ord + Default> Default for LWWReg<V, M>
[src]
impl<'de, V, M> Deserialize<'de> for LWWReg<V, M> where
V: Deserialize<'de>,
M: Deserialize<'de>,
[src]
V: Deserialize<'de>,
M: Deserialize<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]
__D: Deserializer<'de>,
impl<V: Eq, M: Eq> Eq for LWWReg<V, M>
[src]
impl<V: PartialEq, M: Ord> FunkyCmRDT for LWWReg<V, M>
[src]
type Error = Error
User chosen error type
type Op = Self
Same Op laws from non-funky CmRDT above
fn apply(&mut self, op: Self::Op) -> Result<(), Error>
[src]
impl<V: PartialEq, M: Ord> FunkyCvRDT for LWWReg<V, M>
[src]
type Error = Error
User chosen error type
fn merge(
&mut self,
LWWReg { val: val, marker: marker }: Self
) -> Result<(), Error>
[src]
&mut self,
LWWReg { val: val, marker: marker }: Self
) -> Result<(), Error>
Combines two LWWReg
instances according to the marker that
tracks causality. Returns an error if the marker is identical but the
contained element is different.
use crdts::{LWWReg, FunkyCvRDT}; let mut l1 = LWWReg { val: 1, marker: 2 }; let l2 = LWWReg { val: 3, marker: 2 }; // errors! assert!(l1.merge(l2).is_err());
impl<V: Hash, M: Hash> Hash for LWWReg<V, M>
[src]
fn hash<__H: Hasher>(&self, state: &mut __H)
[src]
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher,
1.3.0[src]
H: Hasher,
impl<V: PartialEq, M: PartialEq> PartialEq<LWWReg<V, M>> for LWWReg<V, M>
[src]
impl<V, M> Serialize for LWWReg<V, M> where
V: Serialize,
M: Serialize,
[src]
V: Serialize,
M: Serialize,
fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error> where
__S: Serializer,
[src]
__S: Serializer,
impl<V, M> StructuralEq for LWWReg<V, M>
[src]
impl<V, M> StructuralPartialEq for LWWReg<V, M>
[src]
Auto Trait Implementations
impl<V, M> RefUnwindSafe for LWWReg<V, M> where
M: RefUnwindSafe,
V: RefUnwindSafe,
M: RefUnwindSafe,
V: RefUnwindSafe,
impl<V, M> Send for LWWReg<V, M> where
M: Send,
V: Send,
M: Send,
V: Send,
impl<V, M> Sync for LWWReg<V, M> where
M: Sync,
V: Sync,
M: Sync,
V: Sync,
impl<V, M> Unpin for LWWReg<V, M> where
M: Unpin,
V: Unpin,
M: Unpin,
V: Unpin,
impl<V, M> UnwindSafe for LWWReg<V, M> where
M: UnwindSafe,
V: UnwindSafe,
M: UnwindSafe,
V: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DeserializeOwned for T where
T: for<'de> Deserialize<'de>,
[src]
T: for<'de> Deserialize<'de>,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Member for T where
T: Clone + Eq + Hash,
[src]
T: Clone + Eq + Hash,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,