diff --git a/src/main/scala/errors/Either.scala b/src/main/scala/errors/Either.scala index bec4e26e8ee04442845106e0cb9da0f6309349f6..db0b0d2db568d84fccd4c851aaaf87b750f48801 100644 --- a/src/main/scala/errors/Either.scala +++ b/src/main/scala/errors/Either.scala @@ -1,6 +1,9 @@ package errors -sealed trait Either[+E, +A]: +enum Either[+E, +A]: + case Left(value: E) + case Right(value: A) + def map[B](f: A => B): Either[E, B] = this match case Left(e) => Left(e) case Right(a) => Right(f(a)) @@ -11,5 +14,3 @@ sealed trait Either[+E, +A]: def map2[EE >: E, B, C](other: Either[EE, B])(f: (A, B) => C): Either[EE, C] = ??? -final case class Left[+E](value: E) extends Either[E, Nothing] -final case class Right[+A](value: A) extends Either[Nothing, A] diff --git a/src/main/scala/errors/Option.scala b/src/main/scala/errors/Option.scala index 2c39eec502b372ae2be586f5a0d9596ef167267e..0e5a6f353cfb9f99db3a1f16251a3da7d7094b2c 100644 --- a/src/main/scala/errors/Option.scala +++ b/src/main/scala/errors/Option.scala @@ -1,6 +1,9 @@ package errors -sealed trait Option[+A]: +enum Option[+A]: + case Some(get: A) + case None + def map[B](f: A => B): Option[B] = ??? def getOrElse[B >: A](default: => B): B = ??? @@ -9,8 +12,6 @@ sealed trait Option[+A]: def filter[B](f: A => Boolean): Option[A] = ??? -final case class Some[+A](get: A) extends Option[A] -case object None extends Option[Nothing] object Option: def sequence[A](list: List[Option[A]]): Option[List[A]] = ??? diff --git a/src/main/scala/errors/Team.scala b/src/main/scala/errors/Team.scala index 44245fa89a6f96d8eb11636dce5752d3c5e1dcba..b8b60665dd52df03c455fb886b28d0e9bfc5790f 100644 --- a/src/main/scala/errors/Team.scala +++ b/src/main/scala/errors/Team.scala @@ -1,18 +1,20 @@ package errors -object Team: - val persons = List( - Person("Dagobert", "Finanzabteilung"), - Person("Donald", "Spassabteilung"), - Person("Daniel", "R&D"), - ) +// This allows us to write Some and None without prefix, as we would inside the Option enum +import Option.{None, Some} - type Team = (Person, Person) +val persons = List( + Person("Dagobert", "Finanzabteilung"), + Person("Donald", "Spassabteilung"), + Person("Daniel", "R&D"), +) + +type Team = (Person, Person) - def lookup(name: String): Option[Person] = - persons.find(_.name == name).fold(None: Option[Person])(a => Some(a)) +def lookup(name: String): Option[Person] = + persons.find(_.name == name).fold(None)(a => Some(a)) - def getTeam(name1: String, name2: String): Option[Team] = ??? +def getTeam(name1: String, name2: String): Option[Team] = ??? final case class Person( name: String, diff --git a/src/test/scala/errors/EitherSpec.scala b/src/test/scala/errors/EitherSpec.scala index 5f551a392eb76f81da92149d9e3324992c0fea8a..3b263a29dc2bcefc08325115e43de9f571035d6d 100644 --- a/src/test/scala/errors/EitherSpec.scala +++ b/src/test/scala/errors/EitherSpec.scala @@ -6,10 +6,10 @@ import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers class EitherSpec extends AnyFlatSpec with Matchers with AppendedClues with PendingIfUnimplemented { - val l1: Either[Int, Int] = Left(1) - val l2: Either[Int, Int] = Left(2) - val r1: Either[Int, Int] = Right(1) - val r2: Either[Int, Int] = Right(2) + val l1: Either[Int, Int] = Either.Left(1) + val l2: Either[Int, Int] = Either.Left(2) + val r1: Either[Int, Int] = Either.Right(1) + val r2: Either[Int, Int] = Either.Right(2) "Either" should "have a map2 method which correctly combines two values" in { l1.map2(r1)((a, b) => a+b) shouldBe l1 diff --git a/src/test/scala/errors/OptionSpec.scala b/src/test/scala/errors/OptionSpec.scala index 6d7ffc4cb489f9148685b0cde4d7e69ec08312a9..c079f62c5147dd8c340e11d3902cc184b94e5261 100644 --- a/src/test/scala/errors/OptionSpec.scala +++ b/src/test/scala/errors/OptionSpec.scala @@ -5,6 +5,8 @@ import testutil.PendingIfUnimplemented import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.matchers.should.Matchers +import Option.{Some, None} + class OptionSpec extends AnyFlatSpec with Matchers with AppendedClues with PendingIfUnimplemented { "An option" should "have a map function which transforms it's content" in { Some(3).map(_ + 1) shouldBe Some(4) diff --git a/src/test/scala/errors/TeamSpec.scala b/src/test/scala/errors/TeamSpec.scala index 16889fc2644b5f68da75321a61bb699596cb2cbb..da5536d3ce13f2039ffc8a4c2b4bcb95ff927611 100644 --- a/src/test/scala/errors/TeamSpec.scala +++ b/src/test/scala/errors/TeamSpec.scala @@ -7,7 +7,7 @@ import org.scalatest.matchers.should.Matchers class TeamSpec extends AnyFlatSpec with Matchers with AppendedClues with PendingIfUnimplemented { "getTeam" should "return both persons ore none" in { - Team.getTeam("blar", "Dagobert") shouldBe None - Team.getTeam("Daniel", "Dagobert") shouldBe Some((Team.persons(2), Team.persons(0))) + getTeam("blar", "Dagobert") shouldBe None + getTeam("Daniel", "Dagobert") shouldBe Some((persons(2), persons(0))) } }