The delta CRDT paper introduces a lot of individual abstractions
that all do a lot of cool stuff, but often not separated into their pieces.
This is one of those pieces systematically handling removals based on metadata.
The context encodes dots that have been seen.
The store of type A is assumed to be something that stores individual information per dot.
We represent removals as context that contains a dot, but a store that no longer contains the dot.
Thus, when merging the abstract logic is somewhat along the lines of:
Both contain the (dot, value) pair? => merge value recursively.
Only one contains the dot in the context? => keep that value.
Both contain the dot, but at least one has no matching value? => remove all values for that dot.
Separating into a mergePartial allows extracting the context into the outermost layer reducing metadata overhead.
Decompose a state into potentially smaller parts.
The only requirement is that merging the decomposed results produces the original state.
Requires a bottom to enable automatic decomposition of Product types
Note that the goal here is small individual storage size at reasonable computational cost.
Minimalism of returned results is not guaranteed.
It is also not guaranteed that the result does not overlap.
Decompose a state into potentially smaller parts.
The only requirement is that merging the decomposed results produces the original state.
Requires a bottom to enable automatic decomposition of Product types
Note that the goal here is small individual storage size at reasonable computational cost.
Minimalism of returned results is not guaranteed.
It is also not guaranteed that the result does not overlap.