Trait crdts::CmRDT [−][src]
pub trait CmRDT { type Op; type Validation: Error; fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>; fn apply(&mut self, op: Self::Op); }
Operation based CRDT’s replicate by transmitting each operation.
Associated Types
type Op
[src]
Op defines a mutation to the CRDT. As long as Op’s from one actor are replayed in exactly the same order they were generated by that actor, the CRDT will converge. In other words, we must have a total ordering on each actors operations, while requiring only a partial order over all ops. E.g.
- Actor A produces ops A1, A2
- Actor B produces ops B1, B2
the only valid orderings are:
- A1 < A2 < B1 < B2
- A1 < B1 < A2 < B2
- B1 < A1 < A2 < B2
- A1 < B1 < B2 < A2
- B1 < A1 < B2 < A2
- B1 < B2 < A1 < A2
Applying ops in any of the valid orders will converge to the same CRDT state
Op’s must be idempotent, meaning any Op may be applied more than once.
type Validation: Error
[src]
The validation error returned by validate_op
.
Required methods
fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>
[src]
Some CRDT’s have stricter requirements on how they must be used. To avoid violating these requirements, CRDT’s provide an interface to optionally validate op’s before they are applied.
An Ok(())
response signals that this operation is safe to apply.
Otherwise a structured error is returned to help you determine what
is wrong with the operation
fn apply(&mut self, op: Self::Op)
[src]
Apply an Op to the CRDT
Implementors
impl<A: Ord + Clone + Debug> CmRDT for GCounter<A>
[src]
type Op = Dot<A>
type Validation = Infallible
fn validate_op(&self, _op: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, op: Self::Op)
[src]
impl<A: Ord + Clone + Debug> CmRDT for PNCounter<A>
[src]
type Op = Op<A>
type Validation = <GCounter<A> as CmRDT>::Validation
fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, op: Self::Op)
[src]
impl<A: Ord + Clone + Debug> CmRDT for VClock<A>
[src]
type Op = Dot<A>
type Validation = DotRange<A>
fn validate_op(&self, dot: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, dot: Self::Op)
[src]
Monotonically adds the given actor version to this VClock.
Examples
use crdts::{VClock, Dot, CmRDT}; let mut v = VClock::new(); v.apply(Dot::new("A", 2)); // now all dots applied to `v` from actor `A` where // the counter is not bigger than 2 are nops. v.apply(Dot::new("A", 0)); assert_eq!(v.get(&"A"), 2);
impl<K: Ord, V: Val<A> + Debug, A: Ord + Hash + Clone + Debug> CmRDT for Map<K, V, A>
[src]
type Op = Op<K, V, A>
type Validation = CmRDTValidation<V, A>
fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, op: Self::Op)
[src]
impl<M: Hash + Clone + Eq, A: Ord + Hash + Clone + Debug> CmRDT for Orswot<M, A>
[src]
type Op = Op<M, A>
type Validation = <VClock<A> as CmRDT>::Validation
fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, op: Self::Op)
[src]
impl<T, A: Ord + Clone + Debug> CmRDT for List<T, A>
[src]
type Op = Op<T, A>
type Validation = DotRange<A>
fn validate_op(&self, op: &Self::Op) -> Result<(), Self::Validation>
[src]
fn apply(&mut self, op: Self::Op)
[src]
Apply an operation to an List instance.
If the operation is an insert and the identifier is already present in the List instance the result is a no-op
If the operation is a delete and the identifier is not present in the List instance the result is a no-op