Skip to content

Commit

Permalink
sorting: sort-with and inv-sort-with combinators to simplify common […
Browse files Browse the repository at this point in the history
… [ ... ] compare ] sort idiom
  • Loading branch information
jckarter committed Aug 3, 2009
1 parent 02448dc commit 85794a1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 4 deletions.
18 changes: 14 additions & 4 deletions core/sorting/sorting-docs.factor
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ $nl
"Sorting a sequence with a custom comparator:"
{ $subsection sort }
"Sorting a sequence with common comparators:"
{ $subsection sort-with }
{ $subsection inv-sort-with }
{ $subsection natural-sort }
{ $subsection sort-keys }
{ $subsection sort-values } ;
Expand All @@ -20,16 +22,24 @@ ABOUT: "sequences-sorting"

HELP: sort
{ $values { "seq" "a sequence" } { "quot" { $quotation "( obj1 obj2 -- <=> )" } } { "sortedseq" "a new sorted sequence" } }
{ $description "Sorts the elements into a new array using a stable sort." }
{ $description "Sorts the elements of " { $snippet "seq" } " into a new array using a stable sort." }
{ $notes "The algorithm used is the merge sort." } ;

HELP: sort-with
{ $values { "seq" "a sequence" } { "quot" { $quotation "( object -- key )" } } { "sortedseq" "a new sorted sequence" } }
{ $description "Sorts the elements of " { $snippet "seq" } " by applying " { $link compare } " with " { $snippet "quot" } " to each pair of elements in the sequence." } ;

HELP: inv-sort-with
{ $values { "seq" "a sequence" } { "quot" { $quotation "( object -- key )" } } { "sortedseq" "a new sorted sequence" } }
{ $description "Sorts the elements of " { $snippet "seq" } " by applying " { $link compare } " with " { $snippet "quot" } " to each pair of elements in the sequence and inverting the results." } ;

HELP: sort-keys
{ $values { "seq" "an alist" } { "sortedseq" "a new sorted sequence" } }
{ $description "Sorts the elements comparing first elements of pairs using the " { $link <=> } " word." } ;
{ $description "Sorts the elements of " { $snippet "seq" } " comparing first elements of pairs using the " { $link <=> } " word." } ;

HELP: sort-values
{ $values { "seq" "an alist" } { "sortedseq" "a new sorted sequence" } }
{ $description "Sorts the elements comparing second elements of pairs using the " { $link <=> } " word." } ;
{ $description "Sorts the elements of " { $snippet "seq" } " comparing second elements of pairs using the " { $link <=> } " word." } ;

HELP: natural-sort
{ $values { "seq" "a sequence of real numbers" } { "sortedseq" "a new sorted sequence" } }
Expand All @@ -43,4 +53,4 @@ HELP: midpoint@
{ $values { "seq" "a sequence" } { "n" integer } }
{ $description "Outputs the index of the midpoint of " { $snippet "seq" } "." } ;

{ <=> compare natural-sort sort-keys sort-values } related-words
{ <=> compare natural-sort sort-with inv-sort-with sort-keys sort-values } related-words
5 changes: 5 additions & 0 deletions core/sorting/sorting.factor
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,11 @@ PRIVATE>

: natural-sort ( seq -- sortedseq ) [ <=> ] sort ;

: sort-with ( seq quot -- sortedseq )
[ compare ] curry sort ; inline
: inv-sort-with ( seq quot -- sortedseq )
[ compare invert-comparison ] curry sort ; inline

: sort-keys ( seq -- sortedseq ) [ [ first ] compare ] sort ;

: sort-values ( seq -- sortedseq ) [ [ second ] compare ] sort ;
Expand Down

0 comments on commit 85794a1

Please sign in to comment.