
@function powerNumber($number, $exp){

    $value: 1;
    @if ($exp > 0){
        @for $i from 1 through $exp{
            
          $value: $value * $number;
        }
    }
    @else if ($exp < 0){

        @for $i from 1 through -$exp{
        $value: $value / $number;
    }
    }
    @return $value;
};

@function colorLuminance($color){

    $color-rgb: ('red': red($color),'green': green($color),'blue': blue($color));

    @each $name, $value in $color-rgb {
        $adjusted: 0;
        $value: $value / 255;
        @if ($value < 0.03928){

            $value: $value / 12.92;
        }
        @else{

            $value: ($value + .055) / 1.055;
            $value: powerNumber($value, 2);
            $color-rgb: map-merge($color-rgb, ($name: $value));
        }
    }
    
    @return (map-get($color-rgb, 'red') * .2126) + (map-get($color-rgb, 'green') * .7152) + (map-get($color-rgb, 'blue') * .0722)
};

@function getLinkColorFromBackground($background-color){
    @if (colorLuminance($background-color) > 0.55){
      @return $link-color-light-background;
    }
    @else{
        @return $link-color-dark-background;
    }
}

@function getColorFromBackground($background-color){
    @if (colorLuminance($background-color) > 0.55){
      @return rgba(#000, 0.7);
    }
    @else{
        @return #fff;
    }
}

@function getBorderColor($background-color){

    @if (colorLuminance($background-color) > 0.5){

        @return darken( $background-color, 8% );
    }
    @else {

        @return darken( $background-color, 15% );
    }
}


@function __exp-taylor($x, $steps) {
    $item: 1; $result: 1;
    @for $i from 1 to $steps { $item: $item * $x / $i; $result: $result + $item; }
    @return $result;
}
@function __ln-taylor($x, $steps) {
    $z: ($x - 1) / ($x + 1); $power: $z; $result: $z;
    @for $i from 1 to $steps { $power: $power * $z * $z; $result: $result + $power / (2 * $i + 1); }
    @return 2 * $result;
}
@function __pow-int($base, $exponent) {
    @if $exponent < 0 { @return 1 / __pow-int($base, -$exponent); } 
    @else if $exponent == 0 { @return 1; } 
    @else if $exponent == 1 { @return $base; } 
    @else { $exp: floor($exponent / 2); $pow: __pow-int($base, $exp);
        @if $exp * 2 == $exponent { @return $pow * $pow; } 
        @else { @return $pow * $pow * $base; }
    }
}

@function __log-approx($x) {
    @if $x <= 0 { @error 'cannot calculate log of #{$x}'; } 
    @else if $x >= 1 { @return str-length(inspect(round($x))) - 1; } 
    @else { @return -1 * str-length(inspect(round(1 / $x))); }
}

@function ln($x, $steps: 32) {
    $ln10: 2.302585092994046; $approx: __log-approx($x); $y: $x / __pow-int(10, $approx);
    @return $approx * $ln10 + __ln-taylor($y, $steps);
}

@function pow($x, $exponent, $steps: 32) {
    $exp1: round($exponent); $exp2: $exponent - $exp1; $pow1: __pow-int($x, $exp1);
    @if $exp2 == 0 { @return $pow1; } 
    @else if $x == 0 and $exponent > 0 { @return 0; } 
    @else { $y: ln($x, $steps) * $exp2; $pow2: __exp-taylor($y, $steps); @return $pow1 * $pow2; }
}

@function unit($n) {
    @return #{ $n * $leading + 'rem' };
}