in algebird-core/src/main/scala/com/twitter/algebird/RightFolded.scala [27:44]
def monoid[In, Out](foldfn: (In, Out) => Out): Monoid[RightFolded[In, Out]] =
new Monoid[RightFolded[In, Out]] {
override val zero: RightFoldedZero.type = RightFoldedZero
override def plus(left: RightFolded[In, Out], right: RightFolded[In, Out]): RightFolded[In, Out] =
left match {
case RightFoldedValue(_) => left
case RightFoldedZero => right
case RightFoldedToFold(lList) =>
right match {
case RightFoldedZero => RightFoldedToFold(lList)
case RightFoldedValue(vr) =>
RightFoldedValue(lList.foldRight(vr)(foldfn))
case RightFoldedToFold(rList) => RightFoldedToFold(lList ++ rList)
}
}
}