summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/lib.c b/lib.c
index 77bbb34b..cf25d99e 100644
--- a/lib.c
+++ b/lib.c
@@ -8867,9 +8867,9 @@ static void sort_vec(val vec, val lessfun, val keyfun)
quicksort(vec, lessfun, keyfun, 0, len);
}
-val sort(val seq, val lessfun, val keyfun)
+val nsort(val seq, val lessfun, val keyfun)
{
- val self = lit("sort");
+ val self = lit("nsort");
seq_info_t si = seq_info(seq);
keyfun = default_arg(keyfun, identity_f);
@@ -8891,7 +8891,31 @@ val sort(val seq, val lessfun, val keyfun)
abort();
}
-val shuffle(val seq)
+val sort(val seq, val lessfun, val keyfun)
+{
+ val self = lit("sort");
+ seq_info_t si = seq_info(seq);
+
+ keyfun = default_arg(keyfun, identity_f);
+ lessfun = default_arg(lessfun, less_f);
+
+ switch (si.kind) {
+ case SEQ_NIL:
+ return nil;
+ case SEQ_VECLIKE:
+ case SEQ_HASHLIKE:
+ sort_vec(copy(seq), lessfun, keyfun);
+ return seq;
+ case SEQ_LISTLIKE:
+ return sort_list(copy_list(seq), lessfun, keyfun);
+ case SEQ_NOTSEQ:
+ unsup_obj(self, seq);
+ }
+
+ abort();
+}
+
+val nshuffle(val seq)
{
seq_info_t si = seq_info(seq);
@@ -8928,12 +8952,19 @@ val shuffle(val seq)
return seq;
}
case SEQ_NOTSEQ:
- type_mismatch(lit("shuffle: ~s is not a sequence"), seq, nao);
+ type_mismatch(lit("nshuffle: ~s is not a sequence"), seq, nao);
}
abort();
}
+val shuffle(val seq)
+{
+ if (seqp(seq))
+ return nshuffle(copy(seq));
+ type_mismatch(lit("nshuffle: ~s is not a sequence"), seq, nao);
+}
+
static val multi_sort_less(val funcs_cons, val llist, val rlist)
{
cons_bind (funcs, key_funcs, funcs_cons);
@@ -8976,8 +9007,7 @@ val sort_group(val seq, val keyfun, val lessfun)
{
val kf = default_arg(keyfun, identity_f);
val lf = default_arg(lessfun, less_f);
- val seq_copy = copy(seq);
- val sorted = sort(seq_copy, lf, kf);
+ val sorted = sort(seq, lf, kf);
return partition_by(kf, sorted);
}
@@ -9054,7 +9084,7 @@ val grade(val seq, val lessfun, val keyfun_in)
{
list_collect_decl (out, ptail);
- sort(v, lessfun, keyfun);
+ nsort(v, lessfun, keyfun);
for (i = 0; i < len; i++)
ptail = list_collect(ptail, cdr(v->v.vec[i]));