// Functions: Numbers

@use 'sass:math';
@use 'sass:meta';

// Remove the unit of a length
// @param {Number} $number - Number to remove unit from
// @return {Number} - Unitless number

@function strip-unit($number) {
  @if meta.type-of($number) == 'number' and not math.is-unitless($number) {
    @return math.div($number, ($number * 0 + 1));
  }
  @return $number;
}

// _decimal.scss | MIT License | gist.github.com/terkel/4373420
// Round a number to specified digits.
// @param  {Number} $number A number to round
// @param  {Number} [$digits:0] Digits to output
// @param  {String} [$mode:round] (round|ceil|floor) How to round a number
// @return {Number} A rounded number
// @example
//     decimal-round(0.333)    => 0
//     decimal-round(0.333, 1) => 0.3
//     decimal-round(0.333, 2) => 0.33
//     decimal-round(0.666)    => 1
//     decimal-round(0.666, 1) => 0.7
//     decimal-round(0.666, 2) => 0.67

@function decimal-round($number, $digits: 0, $mode: round) {
  $n: 1;
  // $number must be a number
  @if meta.type-of($number) != number {
    @warn '#{ $number } is not a number.';
    @return $number;
  }
  // $digits must be a unitless number
  @if meta.type-of($digits) != number {
    @warn '#{ $digits } is not a number.';
    @return $number;
  } @else if not math.is-unitless($digits) {
    @warn '#{ $digits } has a unit.';
    @return $number;
  }
  @for $i from 1 through $digits {
    $n: $n * 10;
  }
  @if $mode == round {
    @return math.round($number * $n) / $n;
  } @else if $mode == ceil {
    @return math.ceil($number * $n) / $n;
  } @else if $mode == floor {
    @return math.floor($number * $n) / $n;
  } @else {
    @warn '#{ $mode } is undefined keyword.';
    @return $number;
  }
}

// Ceil a number to specified digits.
// @param  {Number} $number A number to round
// @param  {Number} [$digits:0] Digits to output
// @return {Number} A ceiled number
// @example
//     decimal-ceil(0.333)    => 1
//     decimal-ceil(0.333, 1) => 0.4
//     decimal-ceil(0.333, 2) => 0.34
//     decimal-ceil(0.666)    => 1
//     decimal-ceil(0.666, 1) => 0.7
//     decimal-ceil(0.666, 2) => 0.67

@function decimal-ceil($number, $digits: 0) {
  @return decimal-round($number, $digits, ceil);
}

// Floor a number to specified digits.
// @param  {Number} $number A number to round
// @param  {Number} [$digits:0] Digits to output
// @return {Number} A floored number
// @example
//     decimal-floor(0.333)    => 0
//     decimal-floor(0.333, 1) => 0.3
//     decimal-floor(0.333, 2) => 0.33
//     decimal-floor(0.666)    => 0
//     decimal-floor(0.666, 1) => 0.6
//     decimal-floor(0.666, 2) => 0.66

@function decimal-floor($number, $digits: 0) {
  @return decimal-round($number, $digits, floor);
}

@function is-number($value) {
  @return meta.type-of($value) == 'number';
}

// Escape a decimal number (replaces . with -)
@function escape-number($value) {
  @if meta.type-of($value) != 'number' {
    @return $value;
  }
  $integer: math.floor(strip-unit($value));
  $fraction: $value - $integer;
  @if ($fraction == 0) {
    @return $integer;
  }
  @while ($fraction != math.floor($fraction)) {
    $fraction: $fraction * 10;
  }
  @return $integer + '-' + $fraction;
}
