Desafio: Reunir e ordenar

Crie uma função gather que aceite um argumento do tipo string e retorne outra função. As chamadas da função devem permitir o encadeamento contínuo até order ser chamado.

order deve aceitar um número como argumento e retornar outra função. As chamadas da função devem permitir o encadeamento contínuo até get ser chamado.

get deve retornar todos os argumentos fornecidos às funções gather como uma string, na ordem especificada nas funções order.

Exemplos

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!"

Observações

Espera-se que gather e order sejam encadeados qualquer número de vezes, mas sempre com o mesmo número de invocações para cada um (ou seja, ambas as funções sempre serão encadeadas o mesmo número de vezes).