@use 'sass:list';
@use 'sass:string';

/**
 * Splits a given string to a list of strings.
 *
 * @param    {string}    $string                The input string.
 * @param    {string}    $delimiter ['']        The boundary string.
 * @param    {string}    $separator ['auto']    The output list separator (space|comma|slash|auto).
 *
 * @return   {list}      The list containing strings created by splitting the input string by boundary string.
 */
@function str-split($string, $delimiter: '', $separator: 'auto') {
	$string: #{$string};
	$delimiter: #{$delimiter};
	$output: ();

	@if ($string == '') {
		$output: list.append($output, '', $separator);
	}

	@while (string.length($string) > 0) {
		@if ($delimiter == '') {
			$output: list.append($output, string.slice($string, 1, 1), $separator);
			$string: string.slice($string, 2);
		} @else {
			$index: string.index($string, $delimiter);
			$is-start: $index == 1;
			$is-end: $index == string.length($string) - string.length($delimiter) + 1;

			@if (not $index) {
				$output: list.append($output, $string, $separator);
				$string: '';
			} @else if ($is-start) {
				$output: list.append($output, '');
				$string: string.slice($string, string.length($delimiter) + 1);

				@if ($string == '') {
					$output: list.append($output, '');
				}
			} @else if ($is-end) {
				$output: list.append($output, string.slice($string, 1, $index - 1), $separator);
				$output: list.append($output, '', $separator);
				$string: '';
			} @else {
				$output: list.append($output, string.slice($string, 1, $index - 1), $separator);
				$string: string.slice($string, $index + string.length($delimiter));
			}
		}
	}

	@return $output;
}
