From 4b56f22a2811412aa05a76a1e56171acc7341dee Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 17 Aug 2023 07:15:55 -0700 Subject: New function: csort-group. * autoload.c (csort_set_entries): Register csort-group as autoload trigger for stdlib/csort.tl. * stdlib/csort.tl (csort-group): New function. * tests/012/sort.tl: Tests for sort-group and csort-group. * txr.1: Documented. * stdlib/doc-syms.tl: Updated. --- autoload.c | 1 + stdlib/csort.tl | 3 +++ stdlib/doc-syms.tl | 3 ++- tests/012/sort.tl | 10 ++++++++++ txr.1 | 11 ++++++++++- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/autoload.c b/autoload.c index 417f6fb0..b251ae9e 100644 --- a/autoload.c +++ b/autoload.c @@ -960,6 +960,7 @@ static val csort_set_entries(val fun) { val name[] = { lit("csort"), lit("cnsort"), lit("cssort"), lit("csnsort"), + lit("csort-group"), nil }; autoload_set(al_fun, name, fun); diff --git a/stdlib/csort.tl b/stdlib/csort.tl index 44715236..345b4ce8 100644 --- a/stdlib/csort.tl +++ b/stdlib/csort.tl @@ -41,3 +41,6 @@ (defun csnsort (seq : (less-fun :) (key-fun :)) (cached-sort-body snsort)) + +(defun csort-group (seq : (key-fun :) (less-fun :)) + (partition-by key-fun (csort seq less-fun key-fun))) diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index f3d793d2..edde5200 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -453,6 +453,7 @@ ("csize" "N-01B1B5DF") ("csnsort" "N-02102493") ("csort" "N-02102493") + ("csort-group" "N-00CDF784") ("cssort" "N-02102493") ("cstopb" "N-01B1B5DF") ("cum-norm-dist" "N-03AB449B") @@ -1920,7 +1921,7 @@ ("some-false" "N-016BDF48") ("some-true" "N-016BDF48") ("sort" "N-03923640") - ("sort-group" "N-01E65DDC") + ("sort-group" "N-00CDF784") ("source-loc" "N-0370CD69") ("source-loc-str" "N-0370CD69") ("span-str" "N-0394CA3A") diff --git a/tests/012/sort.tl b/tests/012/sort.tl index 4989a74b..03c122d3 100644 --- a/tests/012/sort.tl +++ b/tests/012/sort.tl @@ -78,3 +78,13 @@ (cssort svec) vec (cssort vec (fun greater)) (reverse vec) (cssort svec (fun greater)) (reverse vec))) + +(mtest + [sort-group '((a 1) (b 1) (a 2) (b 2) (a 3) (c 2) (c 1) (a 4)) car] + (((a 1) (a 2) (a 3) (a 4)) + ((b 1) (b 2)) + ((c 2) (c 1))) + [csort-group '((a 1) (b 1) (a 2) (b 2) (a 3) (c 2) (c 1) (a 4)) car] + (((a 1) (a 2) (a 3) (a 4)) + ((b 1) (b 2)) + ((c 2) (c 1)))) diff --git a/txr.1 b/txr.1 index f41337c0..6e61c412 100644 --- a/txr.1 +++ b/txr.1 @@ -38372,7 +38372,7 @@ has the same effect as: -> "uryyb, jbeyq!" .brev -.coNP Function @ sort-group +.coNP Functions @ sort-group and @ csort-group .synb .mets (sort-group < sequence >> [ keyfun <> [ lessfun ]]) .syne @@ -38389,6 +38389,15 @@ arguments, and then breaks the resulting sequence into groups, based on the equivalence of the elements under .metn keyfun . +The +.code csort-group +differs from +.code sort-group +in that it is based on the caching +.code csort +rather than +.codn sort . + The following equivalence holds: .verb -- cgit v1.2.3