proper implementation of mergeRemoveDelta, #22188

This commit is contained in:
gosubpl 2017-02-20 19:37:19 +01:00 committed by Patrik Nordwall
parent b700b840d1
commit 3d51111b3c
2 changed files with 52 additions and 4 deletions

View file

@ -432,17 +432,20 @@ final class ORSet[A] private[akka] (
private def mergeRemoveDelta(thatDelta: ORSet.RemoveDeltaOp[A]): ORSet[A] = {
val that = thatDelta.underlying
val (elem, thatDot) = that.elementsMap.head
def deleteDots = that.vvector.versionsIterator
def deleteDotsNodes = deleteDots.map { case (dotNode, _) dotNode }
val newElementsMap =
if (that.vvector > vvector || that.vvector == vvector)
elementsMap - elem
else {
if (deleteDots.forall { case (dotNode, dotV) this.vvector.versionAt(dotNode) <= dotV }) {
elementsMap.get(elem) match {
case Some(thisDot)
if (thatDot == thisDot || thatDot > thisDot) elementsMap - elem
if (thisDot.versionsIterator.forall { case (thisDotNode, _) deleteDotsNodes.contains(thisDotNode) })
elementsMap - elem
else elementsMap
case None
elementsMap
}
} else {
elementsMap
}
clearAncestor()
val newVvector = vvector.merge(that.vvector)