Implement a minimal `Option` that has `map` and `flatMap`. ```scala import scala.{Option => _} // TODO: Implement here sealed trait Option[+T] { def map[B](f: T => B): Option[B] = { this match { case Some(v) => Some(f(v)) case None => None } } def flatMap[B](f: T => Option[B]): Option[B] = { this match { case Some(v) => f.apply(v) case None => None } } def fold[B](b:B)(f:T => B): B = { this match { case Some(v) => f(v) case None => b } } } case class Some[+T](t: T) extends Option[T] case object None extends Option[Nothing] val s: Option[Int] = Some(10) // use fold on s s.fold("")(b => s"some string $b") val someAnimal: Option[Animal] = ??? val someMonkey: Option[Monkey] = ??? val none = None def f(o: Option[Animal]) = ??? f(someMonkey) ```