Rompecabezas: Reunir y ordenar

Crea una función gather que acepte un argumento de tipo string y devuelva otra función. Las llamadas a la función deben permitir un encadenamiento continuo hasta llamar a order.

order debe aceptar un número como argumento y devolver otra función. Las llamadas a la función deben permitir un encadenamiento continuo hasta llamar a get.

get debe devolver todos los argumentos proporcionados a las funciones gather como un string en el orden especificado en las funciones order.

Ejemplos

gather("a")("b")("c").order(0)(1)(2).get() ➞ "abc"

gather("a")("b")("c").order(2)(1)(0).get() ➞ "cba"

gather("e")("l")("o")("l")("!")("h").order(5)(0)(1)(3)(2)(4).get()  ➞ "hello!"

Notas

Se espera que gather y order se encadenen cualquier cantidad de veces, pero siempre con la misma cantidad de invocaciones para cada una (es decir, ambas funciones siempre se encadenarán la misma cantidad de veces).