Currently I use a macro like this: (its slow)
Code: Select all
Prototype.i CustomSortListComparisonCallback(*Element1, *Element2)
Macro CustomSortList(ListName, ComparisonCallback)
CustomSortList_ComparisonCallback.CustomSortListComparisonCallback = ComparisonCallback
Repeat
CustomSortList_Quit = #True
ForEach ListName
*CustomSortList_Element = @ListName
While NextElement(ListName)
If CustomSortList_ComparisonCallback(*CustomSortList_Element, ListName)
SwapElements(ListName, *CustomSortList_Element, @ListName)
CustomSortList_Quit = #False
EndIf
Wend
ChangeCurrentElement(ListName, *CustomSortList_Element)
Next
Until CustomSortList_Quit
EndMacro
Code: Select all
Structure Test
a.i
b.i
EndStructure
Procedure Comparison(*Element1.Test, *Element2.Test)
If *Element1\a > *Element2\a
ProcedureReturn #True
ElseIf *Element1\a = *Element2\a
If *Element1\b > *Element2\b
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
NewList Test.Test()
RandomSeed(0)
For n = 1 To 10
AddElement(Test())
Test()\a = Random(5)
Test()\b = Random(5)
Debug Str(Test()\a)+" , "+Str(Test()\b)
Next
CustomSortList(Test(), @Comparison())
Debug "----"
ForEach Test()
Debug Str(Test()\a)+" , "+Str(Test()\b)
Next
CustomSortList(ListName(), *ComparisonCallback)
ComparisonCallback is a procedure that either returns 1 (swap) or 0 (no swap).