36 lines
1.6 KiB
Plaintext
36 lines
1.6 KiB
Plaintext
# as the options have distinct types (INT, BOOL and PROC( STRING, STRING )INT) the #
|
|
# easiest way to support these optional parameters in Algol 68 would be to have an array #
|
|
# with elements of these types #
|
|
# See the Named Arguments sample for cases where the option types are not distinct #
|
|
|
|
# default comparison function #
|
|
PROC default compare = ( STRING a, b )INT: IF a < b THEN -1 ELIF a = b THEN 0 ELSE 1 FI;
|
|
|
|
# sorting procedure #
|
|
PROC configurable sort = ( [,]STRING data, []UNION( INT, BOOL, PROC( STRING, STRING )INT ) options )VOID:
|
|
BEGIN
|
|
# set initial values for the options #
|
|
INT sort column := 2 LWB data;
|
|
BOOL reverse sort := FALSE;
|
|
PROC( STRING, STRING )INT comparator := default compare;
|
|
# overide from the supplied options #
|
|
FOR opt pos FROM LWB options TO UPB options DO
|
|
CASE options[ opt pos ]
|
|
IN ( PROC( STRING, STRING )INT p ): comparator := p
|
|
, ( INT c ): sort column := c
|
|
, ( BOOL r ): reverse sort := r
|
|
ESAC
|
|
OD
|
|
# do the sort .... #
|
|
END # configurable sort # ;
|
|
|
|
# example calls #
|
|
[ 1 : 2, 1 : 3 ]STRING data := ( ( "a", "bb", "cde" ), ( "x", "abcdef", "Q" ) );
|
|
|
|
# sort data, default comparison, first column, reverse order #
|
|
configurable sort( data, ( TRUE ) );
|
|
# sort data, second column, ignore first chaacter when sorting, normal order #
|
|
configurable sort( data, ( 2, ( STRING a, STRING b )INT: default compare( a[ LWB a + 1 : ], b[ LWB b + 1 : ] ) ) );
|
|
# default sort #
|
|
configurable sort( data, () )
|