diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-02-07 08:45:22 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-02-07 08:45:22 -0800 |
commit | 802b2fdfe8040d99e2fe1dc27b905fd1c1764c6b (patch) | |
tree | 5c9ca2de5d948052d29ecf8d8fd939ba7522a44a | |
parent | ab77cda50d4483da64415c13f3f398d9c28a21da (diff) | |
download | txr-802b2fdfe8040d99e2fe1dc27b905fd1c1764c6b.tar.gz txr-802b2fdfe8040d99e2fe1dc27b905fd1c1764c6b.tar.bz2 txr-802b2fdfe8040d99e2fe1dc27b905fd1c1764c6b.zip |
multi-sort: bug: always return list of lists.
* lib.c (multi_sort): If any of the input lists is empty, then
there is an empty list of tuples to sort, producing a an
empty list that doesn't transpose back to a list of empty
lists. We code this as a special case.
-rw-r--r-- | lib.c | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -9745,15 +9745,22 @@ val multi_sort(val lists, val funcs, val key_funcs) { val tuples = mapcarl(list_f, nullify(lists)); - key_funcs = default_null_arg(key_funcs); + if (tuples) { + key_funcs = default_null_arg(key_funcs); - if (functionp(funcs)) - funcs = cons(funcs, nil); + if (functionp(funcs)) + funcs = cons(funcs, nil); - tuples = sort_list(tuples, func_f2(cons(funcs, key_funcs), - multi_sort_less), identity_f); + tuples = sort_list(tuples, func_f2(cons(funcs, key_funcs), + multi_sort_less), identity_f); - return mapcarl(list_f, tuples); + return mapcarl(list_f, tuples); + } else { + list_collect_decl (out, ptail); + for (; !endp(lists); lists = us_cdr(lists)) + ptail = list_collect(ptail, nil); + return out; + } } val sort_group(val seq, val keyfun, val lessfun) |