protected static function merge(array &$src, array &$dst, int $lo, int $mid, int $hi, callable $comp): void
    {
        $i = $lo;
        $j = $mid + 1;
        for ($k = $lo; $k <= $hi; $k++) {
            if ($i > $mid) {
                $dst[$k] = $src[$j++];
            } elseif ($j > $hi) {
                $dst[$k] = $src[$i++];
            } elseif (static::lt($src[$j], $src[$i], $comp)) {
                $dst[$k] = $src[$j++];
            } else {
                $dst[$k] = $src[$i++];
            }
        }
    }