* @param string $string
     * @param string $delimiter
     * @param int    $nth
     * @return string
     */
    Str::macro('segment', function ($string, $delimiter, $nth) {
        $segments = explode($delimiter, $string);
        if ($nth < 0) {
            $segments = array_reverse($segments);
            $nth = abs($nth) - 1;
        } elseif ($nth == 0) {
            $nth++;
        } else {
            $nth--;
        }
        return isset($segments[$nth]) ? $segments[$nth] : '';
    });
}
if (!Str::hasMacro('shift')) {
    /**
     * Shift off the first segment of a string based on a delimiter.
     * Returns the remaining string.
     *
     * @param string $string
     * @param string $delimiter
     * @return string
     */
    Str::macro('shift', function ($string, $delimiter) {
        return Str::replaceFirst(Str::firstSegment($string, $delimiter) . $delimiter, '', $string);
    });
}