Writing this method might be the best choice:
def bimap[A,B,C,D](vals:(A, B), funcs:(A=>C, B=>D)):(C,D) = { val ((func1, func2), (val1, val2)) = funcs -> vals func1(val1) -> func2(val2) }
And if you do this a lot, you can even improve the class of tuples:
implicit class EnhancedTuple2[A, B](val vals: (A, B)) extends AnyVal { def bimap[C, D](funcs: (A=>C, B=>D)) = { val ((func1, func2), (val1, val2)) = funcs -> vals func1(val1) -> func2(val2) } }
So you can:
val func1: Int => Int = x => x * x val func2: Int => String = x => x.toString val tupledFuncs = func1 -> func2 (1, 2).bimap(tupledFuncs)
source share