Two CRDTs side by side
A task with tags and a priority
A grow-only set of tags next to a counter. disjoint_product keeps both: an operation .inl goes to the set, and .inr to the counter.
disjoint_product (gset String) counter-
.inl "urgent"→({urgent}, 0) -
.inr 2→({urgent}, 2) -
.inl "ux"→({urgent, ux}, 2)
- disjoint_product