/// Parses a JSON encoded number
/// @param {String} $source - JSON complete source
/// @param {Number} $pointer - current pointer
/// @throw "Unexpected token $token."
/// @throw "Unexpected end of stream."
/// @return {List} (new pointer, parsed number)
/// @require {function} _throw
/// @require {function} _find-integer
/// @require {function} _find-digits
/// @require {function} _find-exponent
/// @require {function} _pow
@function _json-decode--number($source, $pointer) {
  $pointer: $pointer - 1; // Move back pointer to begininng of number
  $allowed: '-' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'; // Allowed characted to start with
  $first: str-slice($source, $pointer, $pointer); // First character of the number
  $minus: $first == '-'; // Is it negative?

  // Early check for errors
  @if not index($allowed, $first) {
    @return _throw("Unexpected token `" + $first + "`.", $pointer);
  }

  // Find the integer part
  $find-integer: _find-integer($source, $pointer);
  $pointer: nth($find-integer, 1);
  $result:  nth($find-integer, 2);
  @if not $result { // Error occured
    @return $find-integer;
  }

  // Find digits
  @if str-slice($source, $pointer, $pointer) == '.' {
    $find-digits: _find-digits($source, $pointer);
    $pointer: nth($find-digits, 1);
    $digits:  nth($find-digits, 2);

    @if $digits == null { // Empty digits, throw error
      @return _throw("Unexpected end of stream.", $pointer);
    } @else if $digits == false { // Error occured, return it
      @return $find-digits;
    }

    $result: $result + $digits;
  }

  // Find exponent
  @if to-lower-case(str-slice($source, $pointer, $pointer)) == 'e' {
    $find-exponent: _find-exponent($source, $pointer);
    $pointer:  nth($find-exponent, 1);
    $exponent: nth($find-exponent, 2);

    @if $exponent == null { // Empty exponent, throw error
      @return _throw("Unexpected end of stream.", $pointer);
    } @else if $exponent == false { // Error occured, return it
      @return $find-exponent;
    }

    $result: $result * _pow(10, $exponent);
  }

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