@use 'sass:math';
@use 'sass:meta';
@use 'sass:string';

/**
 * Replaces all occurrences of the search string with the replacement string.
 *
 * @param    {string}     $string          The string being searched and replaced on.
 * @param    {string}     $search          The value being searched for.
 * @param    {string}     $replace         The replacement value that replaces found search values.
 * @param    {?number}    $limit [null]    If supplied, this will be set to the number of replacements performed.
 *
 * @return   {string}     The string with searched values replaced.
 */
@function str-replace($string, $search, $replace, $limit: null) {
	$string: #{$string};
	$search: #{$search};
	$replace: #{$replace};
	$limit: if(meta.type-of($limit) == 'number' and math.is-unitless($limit), $limit, string.length($string));

	@if (string.length($string) == 0) {
		@return '';
	}

	@if (string.length($search) == 0 or not string.index($string, $search)) {
		@return $string;
	}

	@if ($limit < 1) {
		@return $string;
	}

	$i: 0;

	@while (string.index($string, $search)) {
		$i: $i + 1;

		@if ($i <= $limit) {
			$index: string.index($string, $search);
			$before: string.slice($string, 1, $index - 1);
			$after: string.slice($string, $index + string.length($search));

			$string: $before + $replace + $after;
		} @else {
			@return $string;
		}
	}

	@return $string;
}
