in algebird-core/src/main/scala/com/twitter/algebird/RightFolded2.scala [55:88]
override def plus(
left: RightFolded2[In, Out, Acc],
right: RightFolded2[In, Out, Acc]
): RightFolded2[In, Out, Acc] = left match {
case RightFoldedValue2(leftV, leftAcc, leftRvals) => {
right match {
case RightFoldedZero2 => left
case RightFoldedToFold2(in) =>
RightFoldedValue2(leftV, leftAcc, leftRvals ++ in)
case RightFoldedValue2(rightV, rightAcc, rightRvals) => {
if (leftRvals.isEmpty) {
// This is the case of two initial values next to each other, return the left:
val newAcc = grpAcc.plus(leftAcc, rightAcc)
RightFoldedValue2(leftV, newAcc, rightRvals)
} else {
val (_, newRightAcc) = doFold(leftRvals, rightV, rightAcc)
// Now actually add the left value, with the right:
val newAcc = grpAcc.plus(leftAcc, newRightAcc)
RightFoldedValue2(leftV, newAcc, rightRvals)
}
}
}
}
case RightFoldedZero2 => right
case RightFoldedToFold2(lList) =>
right match {
case RightFoldedZero2 => left
case RightFoldedToFold2(rList) => RightFoldedToFold2(lList ++ rList)
case RightFoldedValue2(vr, accr, valsr) => {
val (newV, newAcc) = doFold(lList, vr, accr)
RightFoldedValue2(newV, newAcc, valsr)
}
}
}