[][src]Struct crdts::lwwreg::LWWReg

pub struct LWWReg<V, M> {
    pub val: V,
    pub marker: M,
}

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]

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

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]

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]

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]

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

impl<V, M> Send for LWWReg<V, M> where
    M: Send,
    V: Send

impl<V, M> Sync for LWWReg<V, M> where
    M: Sync,
    V: Sync

impl<V, M> Unpin for LWWReg<V, M> where
    M: Unpin,
    V: Unpin

impl<V, M> UnwindSafe for LWWReg<V, M> where
    M: UnwindSafe,
    V: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> DeserializeOwned for T where
    T: for<'de> Deserialize<'de>, 
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> Member for T where
    T: Clone + Eq + Hash
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,