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)
```