The idea of gather is to pack all the input values at the end of the function call. We use InputType, from our Signature struct to extract the current InputType, get a range of values from our accessor (using the InputIndex) then call Gather recursively, with the rest of our input types in Signature, InputIndex incremented by one and our newly InputValues moved at the end and packed into InArgs. We specialize the case where Signature is empty, meaning we got all our input values.