summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-02-07 08:45:22 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-02-07 08:45:22 -0800
commit802b2fdfe8040d99e2fe1dc27b905fd1c1764c6b (patch)
tree5c9ca2de5d948052d29ecf8d8fd939ba7522a44a
parentab77cda50d4483da64415c13f3f398d9c28a21da (diff)
downloadtxr-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.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/lib.c b/lib.c
index ab60ebeb..1abd6b83 100644
--- a/lib.c
+++ b/lib.c
@@ -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)