diff --git a/scala/src/main/scala/org/gym/fp/BooleanResult.scala b/scala/src/main/scala/org/gym/fp/BooleanResult.scala new file mode 100644 index 0000000..499a67b --- /dev/null +++ b/scala/src/main/scala/org/gym/fp/BooleanResult.scala @@ -0,0 +1,27 @@ +package org.gym.fp + +// data type +sealed trait BooleanResult[+A] { + + def map[B](f: A => B): BooleanResult[B] + + def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B] + +} + +// data constructor +case class TrueResult[A](value: A) extends BooleanResult[A] { + + override def map[B](f: A => B): BooleanResult[B] = TrueResult(f(value)) + + override def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B] = f(value) + +} + +case class FalseResult[A]() extends BooleanResult[A] { + + override def map[B](f: A => B): BooleanResult[B] = FalseResult() + + override def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B] = FalseResult() + +} diff --git a/scala/src/main/scala/org/gym/fp/EitherExample.scala b/scala/src/main/scala/org/gym/fp/EitherExample.scala new file mode 100644 index 0000000..504c196 --- /dev/null +++ b/scala/src/main/scala/org/gym/fp/EitherExample.scala @@ -0,0 +1,22 @@ +package org.gym.fp + +case class Failed(msg: String) + +object EitherExample extends App { + + println(giveMeAnAnswer(divideXByY(1, 0))) + println(giveMeAnAnswer(divideXByY(1, 1))) + + def divideXByY(x: Int, y: Int): Either[String, Int] = { + if (y == 0) Left("Dude, can't divide by 0") else Right(x / y) + } + + private def giveMeAnAnswer(question: Either[String, Int]): String = { + question match { + case Left(value) => "Answer: " + value + case Right(value) => "Answer: " + value + case _ => "I don't known" + } + } + +}