@use "sass:map";
@use "sass:math";
@use "sass:string";

/**
 * To number - convert string to number
 *
 * @author: Stackoverflow - https://stackoverflow.com/questions/47630616/scss-arithmetic-operation-with-string
 *
 * @param string $value
 *
 * Examples :
 *          @for (dollar)i from 1 through 6 {
 *              &[data-per-line="#{(dollar)i}"] {
 *                  .card {
 *                      width: column(to-number(#{math(dot)div(12, (dollar)i + 1)}));
 *                  }
 *              }
 *          }
 */

@function to-number($value) {
    @if type-of($value) == "number" {
        @return $value;
    } @else if type-of($value) != "string" {
        @error "Value for `to-number` should be a number or a string.";
    }

    $result: 0;
    $digits: 0;
    $minus: string.slice($value, 1, 1) == "-";
    $numbers: ("0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9);

    @for $i from if($minus, 2, 1) through str-length($value) {
        $character: string.slice($value, $i, $i);

        @if (index(map-keys($numbers), $character) or $character == ".") {
            @if $character == "." {
                $digits: 1;
            } @else if $digits == 0 {
                $result: $result * 10 + map.get($numbers, $character);
            } @else {
                $digits: $digits * 10;
                $result: $result + math.div(map.get($numbers, $character), $digits);
            }
        }
    }

    @return if($minus, -$result, $result);
}
