"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)));