StrongRemove

Struct StrongRemove 

Source
pub struct StrongRemove<ID, OP, C, M> { /* private fields */ }
Expand description

An implementation of Resolver trait which follows strong remove ruleset.

Concurrent operations are identified and processed, any which should be invalidated are added to the operation filter and not applied to the group state. Once an operation has been filtered, any operations which depended on any resulting state will not be applied to group state either. Ruleset for Concurrent Operations

The following ruleset is applied when choosing which operations to “filter” when concurrent operations are processed. It can be assumed that the behavior is equivalent for an admin member being removed, or demoted from admin to a lower access level.

§Strong Remove Concurrency Rules

§Removals

If a removal has occurred, filter any concurrent operations by the removed member, as long as it’s 1) not a predecessor of the remove operation, and 2) not a mutual removal (see below).

§Mutual removals

Mutual removes can occur directly (A removes B, B removes C) or in a cycle (A removes B, B removes C, C removes A), cycles may even include delegations by removed members. The result of all of these cases should be that all members which were part of the cycle should be removed from the group.

§Re-adding member concurrently

If Alice removes Charlie and Bob removes then adds Charlie concurrently, Charlie is removed from the group and all their concurrent actions should be filtered.

§Filtering of transitively dependent operations

When an operation is “explicitly” filtered it may cause dependent operations to become invalid, these operations should not be applied to the group state.

Trait Implementations§

Source§

impl<ID: Clone, OP: Clone, C: Clone, M: Clone> Clone for StrongRemove<ID, OP, C, M>

Source§

fn clone(&self) -> StrongRemove<ID, OP, C, M>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<ID: Debug, OP: Debug, C: Debug, M: Debug> Debug for StrongRemove<ID, OP, C, M>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<ID: Default, OP: Default, C: Default, M: Default> Default for StrongRemove<ID, OP, C, M>

Source§

fn default() -> StrongRemove<ID, OP, C, M>

Returns the “default value” for a type. Read more
Source§

impl<ID, OP, C, M> Resolver<ID, OP, C, M> for StrongRemove<ID, OP, C, M>
where ID: IdentityHandle + Ord, OP: OperationId + Ord, C: Conditions, M: Clone + Operation<ID, OP, GroupControlMessage<ID, C>>,

Source§

fn rebuild_required(y: &Self::State, operation: &M) -> Result<bool, Self::Error>

Identify if an operation should trigger a group state rebuild.

Source§

fn process(y: Self::State) -> Result<Self::State, Self::Error>

Process the group operation graph, producing a new filter and re-building all state accordingly.

Source§

type State = GroupCrdtInnerState<ID, OP, C, M>

Source§

type Error = GroupCrdtInnerError<OP>

Auto Trait Implementations§

§

impl<ID, OP, C, M> Freeze for StrongRemove<ID, OP, C, M>

§

impl<ID, OP, C, M> RefUnwindSafe for StrongRemove<ID, OP, C, M>

§

impl<ID, OP, C, M> Send for StrongRemove<ID, OP, C, M>
where ID: Send, OP: Send, C: Send, M: Send,

§

impl<ID, OP, C, M> Sync for StrongRemove<ID, OP, C, M>
where ID: Sync, OP: Sync, C: Sync, M: Sync,

§

impl<ID, OP, C, M> Unpin for StrongRemove<ID, OP, C, M>
where ID: Unpin, OP: Unpin, C: Unpin, M: Unpin,

§

impl<ID, OP, C, M> UnwindSafe for StrongRemove<ID, OP, C, M>
where ID: UnwindSafe, OP: UnwindSafe, C: UnwindSafe, M: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

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

Source§

fn vzip(self) -> V