//
// $Id$
//

function main()

  local oError := ErrorNew()

  local a := { 3, 2, 1 }
  local b := { 10 }
  local c := { 2, .T., "B", NIL, { 1 }, {|| b }, oError, Date(), 1, .F., "A", NIL, Date() - 1, { 0 }, {|| a }, oError }
  local t

  ?
  ?
  ? "Original.....:", aDump( t := a )
  ? "Asort.c......:", aDump( aSort( t := aClone( a ) ) )
  ? "Asort.c.block:", aDump( aSort( t := aClone( a ), , , {| x, y | x < y } ) )
  ?
  ? "Original.....:", aDump( t := b )
  ? "Asort.c......:", aDump( aSort( t := aClone( b ) ) )
  ? "Asort.c.block:", aDump( aSort( t := aClone( b ), , , {| x, y | x < y } ) )
  ?
  ? "Original.....:", aDump( t := c )
  ? "Asort.c......:", aDump( aSort( t := aClone( c ) ) )
  ? "Asort.c.block:", aDump( aSort( t := aClone( c ), , , {| x, y | xToStr(x) < xToStr(y) } ) )

return nil

function aDump( a )

  local cStr := ""
  local n := len( a )
  local i

  for i := 1 to n
    cStr += alltrim( xToStr( a[i] ) ) + " "
  next

return cStr

function xToStr( xValue )

  LOCAL cType := ValType( xValue )

  do case
    case cType == "C" .or. cType == "M"
      return xValue
    case cType == "N"
      return AllTrim( Str( xValue ) )
    case cType == "D"
      return DToC( xValue )
    case cType == "L"
      return if( xValue, ".T.", ".F." )
    case cType == "U"
      return "NIL"
    case cType == "A"
      return "{.}"
    case cType == "B"
      return "{|| }"
    case cType == "O"
      return "[O]"
  endcase

return xValue
