static function rec($a, $cmp, $from, $to)
 {
     $middle = $from + $to >> 1;
     if ($to - $from < 12) {
         if ($to <= $from) {
             return;
         }
         $_g = $from + 1;
         while ($_g < $to) {
             $i = $_g++;
             $j = $i;
             while ($j > $from) {
                 if (call_user_func_array($cmp, array($a[$j], $a[$j - 1])) < 0) {
                     haxe_ds_ArraySort::swap($a, $j - 1, $j);
                 } else {
                     break;
                 }
                 $j--;
             }
             unset($j, $i);
         }
         return;
     }
     haxe_ds_ArraySort::rec($a, $cmp, $from, $middle);
     haxe_ds_ArraySort::rec($a, $cmp, $middle, $to);
     haxe_ds_ArraySort::doMerge($a, $cmp, $from, $middle, $to, $middle - $from, $to - $middle);
 }