Skip to content

Instantly share code, notes, and snippets.

@cm-kazup0n
Created January 23, 2020 09:36
Show Gist options
  • Save cm-kazup0n/5dc7b2040d381f46623a4ac40fff39ad to your computer and use it in GitHub Desktop.
Save cm-kazup0n/5dc7b2040d381f46623a4ac40fff39ad to your computer and use it in GitHub Desktop.
semigroupの素振り
import cats.implicits._
import cats.{Semigroup, Show}
import cats.effect.{Effect, IO}
sealed trait MessageProcessResult
object MessageProcessResult {
case object Done extends MessageProcessResult
case object Pending extends MessageProcessResult
val values: Seq[MessageProcessResult] = Seq(Done, Pending)
}
implicit val show:Show[MessageProcessResult] = Show {
case MessageProcessResult.Done => "Done"
case MessageProcessResult.Pending => "Pending"
}
implicit val sg:Semigroup[MessageProcessResult] = (x: MessageProcessResult, y: MessageProcessResult) => (x, y) match {
case (MessageProcessResult.Done, MessageProcessResult.Done) => MessageProcessResult.Done
case _ => MessageProcessResult.Pending
}
import MessageProcessResult._
import scala.language.higherKinds
def foldResult[F[_]:Effect](fa: F[MessageProcessResult], fb: F[MessageProcessResult], fc:F[MessageProcessResult]): F[MessageProcessResult] = for {
a <- fa
b <- fb
c <- fc
} yield a |+| b |+| c
type F[A] = IO[A]
foldResult[F](
Effect[F].pure(Done),
Effect[F].pure(Pending),
Effect[F].pure(Done)
).unsafeRunSync()
//res0: MessageProcessResult = Pending
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment