Guest User

Untitled

a guest
Jan 23rd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. import cats.effect.Sync
  2.  
  3. import scala.language.higherKinds
  4. import cats.instances.list._
  5. import cats.syntax.applicative._
  6. import cats.syntax.flatMap._
  7. import cats.syntax.functor._
  8. import cats.syntax.traverse._
  9.  
  10. import scala.util.{Success, Try}
  11.  
  12.  
  13. final case class Operation(name: String)
  14.  
  15. sealed trait ExecutionResult {
  16. def stringify: String
  17. def operation: Operation
  18. }
  19.  
  20. final case class UnitExecution(state: Int, operation: Operation) extends ExecutionResult {
  21. override def stringify: String = s"unit execution result: $state, of operation $operation"
  22. }
  23.  
  24. final case class InterruptedExecution(operation: Operation) extends ExecutionResult {
  25. override def stringify: String = "interrupted execution result"
  26. }
  27.  
  28. trait Logger2[F[_]] {
  29. def info(message: String): F[Unit]
  30. }
  31.  
  32. object Logger2 {
  33. def getLogger[F[_]: Sync]: Logger2[F] =
  34. (message: String) => Sync[F].delay(println(message))
  35. }
  36.  
  37. object Main2 extends App {
  38.  
  39. def execOperations[F[_]: Sync](operations: List[Operation]): F[Unit] = {
  40. def execOperation(operation: Operation): F[Try[ExecutionResult]] =
  41. (Success(UnitExecution(123, operation)): Try[ExecutionResult]).pure[F]
  42.  
  43. val logger = Logger2.getLogger[F]
  44.  
  45. operations.traverse { op =>
  46. execOperation(op).flatMap { res =>
  47. res.map(x => logger.info(x.stringify)).getOrElse {
  48. logger.info(s"operation $op failed")
  49. }
  50. }
  51. }.map(_ => ())
  52. }
  53.  
  54. execOperations[cats.effect.IO](List(Operation("o1"), Operation("o2"), Operation("o3"))).unsafeRunSync()
  55. }
Add Comment
Please, Sign In to add comment