I have method eval which takes List of Function and arguments, currently I am writing case for every possible function. How can I write it more generic?
implicit class Expression(p: Product) {
def eval = p.productIterator.toList match {
case (f: ((Any) => Any)) :: p1 :: Nil => f(p1)
case (f: ((Any, Any) => Any)) :: p1 :: p2 :: Nil => f(p1, p2)
case (f: ((Any, Any, Any) => Any)) :: p1 :: p2 :: p3 :: Nil => f(p1, p2, p3)
}
}
def print = (x: Any) => println(">> " + x)
def add = (x: Any, y: Any) => x.asInstanceOf[Int] + y.asInstanceOf[Int]
(print, "test").eval
(add, 2, 3).eval