@use 'sass:math';
@use 'sass:list';
@use 'sass:string';

@function unit-length($number, $unit) {
    $strings: 'px' 'cm' 'mm' '%' 'ch' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax';
    $units: 1px 1cm 1mm 1% 1ch 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax;
    $index: list.index($strings, $unit);

    @if not $index {
        @warn "Invalid unit `#{$unit}`.";
        @return false;
    }

    @return $number * list.nth($units, $index);
}

// @author Hugo Giraudel
// @link http://hugogiraudel.com/2014/01/15/sass-string-to-number/
@function number($string) {
    // Matrices
    $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
    $numbers: 0 1 2 3 4 5 6 7 8 9;

    // Result
    $result: 0;
    $divider: 0;
    $minus: false;

    // Looping through all characters
    @for $i from 1 through string.length($string) {
        $character: string.slice($string, $i, $i);
        $index: list.index($strings, $character);

        @if $character == '-' {
            $minus: true;
        } @else if $character == '.' {
            $divider: 1;
        } @else {
            @if not $index {
                $result: if($minus, $result * -1, $result);
                @return unit-length($result, string.slice($string, $i));
            }

            $number: list.nth($numbers, $index);

            @if $divider == 0 {
                $result: $result * 10;
            } @else {
                // Move the decimal dot to the left
                $divider: $divider * 10;
                $number: math.div($number, $divider);
            }

            $result: $result + $number;
        }
    }

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