"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`) tagged("Functions") shared Result(*FirstArgs)(*SecondArgs) shuffle<Result,FirstArgs,SecondArgs>( Result(*SecondArgs)(*FirstArgs) f) given FirstArgs satisfies Anything[] given SecondArgs satisfies Anything[] => flatten((SecondArgs secondArgs) => flatten((FirstArgs firstArgs) => unflatten(unflatten(f)(firstArgs))(secondArgs)));