@use "sass:list";
@use "sass:string";
@use "sass:meta";
@use "./condition" as *;

/*
---
name: replace()
category:
  - core/function
---
Replace in a string

### scss
```scss
//
// @param   string|list  $substr
// @param   string       $newsubstr
// @param   string       $string
// @return  string
//

@use "node_modules/sass-basis/src/css/core";

$value: function.replace('p', 'a', 'apple'); // => aaale
```
*/

@function replace($substr, $newsubstr, $string) {
  @if ('list' == meta.type-of($substr)) {
    @each $_s in $substr {
      $string: replace($_s, $newsubstr, $string);
    }
    @return $string;
  } @else {
    $position-found: string.index($string, $substr);
    $processed: ();

    @if (is-null($position-found)) {
      @return $string;
    }

    @while (not is-null($position-found) and $position-found > 0) {
      $length-substr: string.length($substr);
      $processed: list.append($processed, string.slice($string, 0, $position-found - 1));
      $processed: list.append($processed, $newsubstr);
      $string: string.slice($string, $position-found + $length-substr);
      $position-found: string.index($string, $substr);
    }

    $processed: list.append($processed, $string);
    $string: "";

    @each $s in $processed {
      $string: #{$string}#{$s};
    }

    @return $string;
  }
}
