$e-separator: '__';
$m-separator: '--';
$B: ''; // 存储当前 block 名
$E: ''; // 也可以存储下 element 名
$state-prefix: 'is-';
$ui-prefix: 'lanaya';

@function selectorToString($selector) {
  $selector: inspect($selector); //cast to string
  $selector: str-slice($selector, 2, -2); //remove bracket
  @return $selector
}

@function containsModifier($selector) {
  $selector: selectorToString($selector);
  @if str-index($selector, $m-separator) {
    @return true;
  } @else {
    @return false;
  }
}

@function containWhenFlag($selector) {
  $selector: selectorToString($selector);
  @if str-index($selector, '.' + $state-prefix) {
    @return true;
  } @else {
    @return false;
  }
}

@function containPseudoClass($selector) {
  $selector: selectorToString($selector);
  @if str-index($selector, ':') {
    @return true;
  } @else {
    @return false;
  }
}

@mixin pseudo($pseudo) {
  @at-root {
    #{&}#{':#{$pseudo}'} {
      @content
    }
  }
}

@mixin when($state) {
  @at-root {
    #{&}.#{$state-prefix + $state} {
      @content;
    }
  }
}

@mixin share-rule($name) {
  $rule-name: '%shared-'+$name;
  @at-root #{$rule-name} {
    @content
  }
}

@mixin extend-rule($name) {
  @extend #{'%shared-'+$name};
}

@mixin b($block) {
  $B: #{$ui-prefix}-$block !global;
  .#{$B} {
    @content;
  }
}

@mixin e($element) {
  $E: $element !global;
  $selector: &;
  @if containsModifier($selector) or containPseudoClass($selector) {
    @at-root {
      #{$selector} {
        .#{$B + $e-separator + $element} {
          @content;
        }
      }
    }
  } @else if containWhenFlag($selector) {
    @at-root {
      #{$selector}.#{$B + $e-separator + $element} {
        @content;
      }
    }
  } @else {
    @at-root {
      #{$selector + $e-separator + $element} {
        @content;
      }
    }
  }
}

@mixin m($modifier) {
  $selector: &;
  @if containPseudoClass($selector) {
    @at-root {
      #{$selector} {
        #{$selector + $m-separator + $modifier} {
          @content;
        }
      }
    }
  } @else {
    @at-root {
      #{$selector + $m-separator + $modifier} {
        @content;
      }
    }
  }
}
