custom_sort
Definition: | sequence s2 = custom_sort(object rid_s, sequence s1, object data={}, integer order=ASCENDING) |
Description: | Sort the elements of sequence s1, using the compare function rid_s, which must have been obtained from calling routine_id. |
pwa/p2js: | Supported. |
Comments: |
Alternatively (new in 0.8.0) rid_s can be the actual data to be sorted when s1 is a tagset, in
which case a standard compare is used.
To use a custom comparison routine in a tag sort, put the actual data to be sorted in data[1] instead (and tags in s1). Prior to 0.8.0 the only way that could be achieved was for the data being sorted to be placed in a file-level variable (see demo\tagsort.exw) that the custom comparison routine would then reference, which was obviously not thread-safe, and not even task-safe should the comparison routine invoke task_yield(), presumably in an attempt to remain responsive during a potentially lengthy sorting operation. The data parameter, if provided, should be a length-1 sequence, or an atom, containing the third parameter to be passed to the comparison routine. If data is left as the default of {}, the comparison routine only recieves two arguments, and in that way legacy code can continue to use custom_sort() without having to be modified. The order parameter can also be DESCENDING, or one of the other aliases, NORMAL_ORDER or REVERSE_ORDER. The compare function should be similar to the builtin compare(), accepting two arguments and returning -1, 0 or +1, or for a custom tag sort (with data!={}) it should have a signature similar to (integer i, j, object user_data), where user_data gets set to data[1], or data itself should it be an atom [eg a tag sort on raw memory]. |
|
For compatibility with Euphoria, builtins/sort.e also defines sort_columns(sequence x, sequence column_list)
as a specific custom sort. The column list should be an ordered set of integer column indexes, which can be negative to
sort that particular column in descending order, eg table = sort_columns(table,{2,1,-3}) .
|
|
demo\tagsort.exw |
Implementation: | See builtins\sort.e (an autoinclude) for details of the actual implementation. |
See Also: | sort, compare, routine_id, tagset |