// String Replace Function
// --------------------------------------------------

@function str-replace($string, $search, $replace: "") {
  $index: str-index($string, $search);

  @if $index {
    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
  }

  @return $string;
}

// String Split Function
// --------------------------------------------------

@function str-split($string, $separator) {
  // empty array/list
  $split-arr: ();
  // first index of separator in string
  $index: str-index($string, $separator);
  // loop through string
  @while $index != null {
    // get the substring from the first character to the separator
    $item: str-slice($string, 1, $index - 1);
    // push item to array
    $split-arr: append($split-arr, $item);
    // remove item and separator from string
    $string: str-slice($string, $index + 1);
    // find new index of separator
    $index: str-index($string, $separator);
  }
  // add the remaining string to list (the last item)
  $split-arr: append($split-arr, $string);

  @return $split-arr;
}

@function str-last-index($str, $search) {
  $split: str-split($str, $search);
  $len: length($split);

  @if ($len > 1) {
    $count: 0;
    @for $i from 1 through ($len - 1) {
      $item: nth($split, $i);
      $count: $count + str-length($item);
    }

    @return $count + $len;
  } @else {
    @error "str-last-index was unable to find any instances of '#{$search}' inside '#{$str}'";
  }
}

// Str extract between start and end
// --------------------------------------------------

@function str-extract($string, $start, $end) {
  $start-index: str-index($string, $start);

  @if $start-index {
    $post: str-slice($string, $start-index + str-length($start));
    $end-index: str-index($post, $end);

    @if $end-index {
      @return str-slice($post, 1, $end-index - 1);
    }
  }

  @return null;
}

@function str-contains($string, $needle) {
  @if (type-of($string) == string) {
    @return str-index($string, $needle) != null;
  }

  @return false;
}
