object && { def unapply[A](e: A) = Some(e -> e) def test() { val greaterThan10 = Find[Int](_ > 10) List(1, 2, 11, 3) match { // All must succeed case greaterThan10(ten) && Last(last) && Head(head) => println(ten) // 11 println(last) // 3 println(head) // 1 case _ => println("Sorry") } } } object Head { def unapply[T](lst: List[T]) = lst.headOption } case class Find[T](f: T => Boolean) { def unapply(lst: List[T]) = lst.find(f) } object Last { def unapply[T](lst: List[T]) = lst.lastOption }