def monoid[In, Out]()

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)
            }
        }
    }