minByOption
trait Collection[A] {
def minByOption[W](f: (A) => W): A
}
minByOption applies f to each element and returns the element that yields the smallest value wrapped with Some.
On empty collections minByOption returns None.