1 ! Copyright (C) 2014 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: arrays kernel math math.order math.private sequences
5 sequences.private strings vectors ;
11 :: quicksort ( seq from to quot: ( obj1 obj2 -- <=> ) -- )
13 from to fixnum+fast 2/ seq nth-unsafe :> pivot
17 over seq nth-unsafe pivot quot call
19 ] [ [ 1 fixnum+fast ] dip ] while
22 dup seq nth-unsafe pivot quot call
24 ] [ 1 fixnum-fast ] while
27 [ seq exchange-unsafe ]
28 [ [ 1 fixnum+fast ] [ 1 fixnum-fast ] bi* ] 2bi
32 [ seq from ] dip quot quicksort
33 [ seq ] dip to quot quicksort
34 ] when ; inline recursive
36 : check-array-capacity ( n -- n )
37 integer>fixnum-strict dup array-capacity?
38 [ "too large" throw ] unless ; inline
42 : sort-with! ( seq quot: ( obj1 obj2 -- <=> ) -- )
43 [ 0 over length check-array-capacity 1 - ] dip quicksort ; inline
45 : inv-sort-with! ( seq quot: ( obj1 obj2 -- <=> ) -- )
46 '[ @ invert-comparison ] sort-with! ; inline
48 : sort-by! ( seq quot: ( elt -- key ) -- )
49 [ compare ] curry sort-with! ; inline
51 : inv-sort-by! ( seq quot: ( elt -- key ) -- )
52 [ compare invert-comparison ] curry sort-with! ; inline
54 GENERIC: sort! ( seq -- )
56 M: object sort! [ <=> ] sort-with! ;
57 M: array sort! [ <=> ] sort-with! ;
58 M: vector sort! [ <=> ] sort-with! ;
59 M: string sort! [ <=> ] sort-with! ;
61 GENERIC: inv-sort! ( seq -- )
63 M: object inv-sort! [ <=> ] inv-sort-with! ;
64 M: array inv-sort! [ <=> ] inv-sort-with! ;
65 M: vector inv-sort! [ <=> ] inv-sort-with! ;
66 M: string inv-sort! [ <=> ] inv-sort-with! ;