"Given a function with two parameter lists, return a function with the order of the argument lists reversed. The parameter lists may have any number of parameters. That is, if `fun` has type `W(A,B)(X,Y,Z)` then `shuffle(fun)` has type `W(X,Y,Z)(A,B)`. This function is often used in conjunction with `curry()`." see (`function curry`) shared Callable<Callable<Result,FirstArgs>,SecondArgs> shuffle<Result,FirstArgs,SecondArgs>( Callable<Callable<Result,SecondArgs>,FirstArgs> f) given FirstArgs satisfies Anything[] given SecondArgs satisfies Anything[] => flatten((SecondArgs secondArgs) => flatten((FirstArgs firstArgs) => unflatten(unflatten(f)(firstArgs))(secondArgs)));