def _weld_sort(arrays, weld_types, ascending=True):
    obj_id, index_obj = create_weld_object(arrays[0])
    index_obj.weld_code = 'len({})'.format(obj_id)
    # get indexes that will be sorted and returned
    index_column = weld_range(0, index_obj, 1)

    arrays.insert(0, index_column)
    weld_types.insert(0, WeldLong())
    weld_obj_vec_of_struct = weld_arrays_to_vec_of_struct(arrays, weld_types)

    weld_obj = create_empty_weld_object()
    weld_obj_vec_of_struct_id = get_weld_obj_id(weld_obj, weld_obj_vec_of_struct)

    types = struct_of('{e}', weld_types)
    # TODO: update here when sorting on structs is possible
    ascending_sort_func = '{}'.format(', '.join(('e.${}'.format(i) for i in range(1, len(arrays)))))
    zero_literals = dict(enumerate([to_weld_literal(0, weld_type) for weld_type in weld_types]))
    descending_sort_func = '{}'.format(', '.join(('{} - e.${}'.format(zero_literals[i], i)
                                                  for i in range(1, len(arrays)))))
    sort_func = ascending_sort_func if ascending else descending_sort_func

    weld_template = 'sort({struct}, |e: {types}| {sort_func})'

    weld_obj.weld_code = weld_template.format(struct=weld_obj_vec_of_struct_id,
                                              types=types,
                                              sort_func=sort_func)

    return weld_obj