static function rotate($a, $cmp, $from, $mid, $to)
 {
     $n = null;
     if ($from === $mid || $mid === $to) {
         return;
     }
     $n = haxe_ds_ArraySort::gcd($to - $from, $mid - $from);
     while ($n-- !== 0) {
         $val = $a[$from + $n];
         $shift = $mid - $from;
         $p1 = $from + $n;
         $p2 = $from + $n + $shift;
         while ($p2 !== $from + $n) {
             $a[$p1] = $a[$p2];
             $p1 = $p2;
             if ($to - $p2 > $shift) {
                 $p2 += $shift;
             } else {
                 $p2 = $from + ($shift - ($to - $p2));
             }
         }
         $a[$p1] = $val;
         unset($val, $shift, $p2, $p1);
     }
 }