Скажем, у меня есть функция, принимающая один аргумент
def fun(x: Int) = x
Основываясь на этом, я хочу сгенерировать новую функцию с тем же соглашение о вызовах, но это применит некоторое преобразование к его аргументам перед делегированием исходной функции. Для этого я мог
def wrap_fun(f: (Int) => Int) = (x: Int) => f(x * 2)
wrap_fun(fun)(2) // 4
Как можно сделать то же самое, кроме как для функций любой арности, которые имеют только ту часть аргументов, к которой нужно применить преобразование?
def fun1(x: Int, y: Int) = x
def fun2(x: Int, foo: Map[Int,Str], bar: Seq[Seq[Int]]) = x
wrap_fun(fun1)(2, 4) // 4
wrap_fun(fun2)(2, Map(), Seq()) // 4
Как будет выглядеть определение wrap_fun
, заставляющее вышеперечисленные вызовы работать?