(s: string, i: number)
| 64 | } |
| 65 | |
| 66 | function consumeNumber(s: string, i: number): number { |
| 67 | enum State { |
| 68 | NATURAL, |
| 69 | REAL, |
| 70 | EXPONENT_SIGN, |
| 71 | EXPONENT, |
| 72 | } |
| 73 | let state = State.NATURAL; |
| 74 | for (; i < s.length; i++) { |
| 75 | if (state === State.NATURAL) { |
| 76 | if (s[i] === '.') { |
| 77 | state = State.REAL; |
| 78 | } else if (s[i] === 'e' || s[i] === 'E') { |
| 79 | state = State.EXPONENT_SIGN; |
| 80 | } else if (!isDigit(s[i])) { |
| 81 | break; |
| 82 | } |
| 83 | } else if (state === State.REAL) { |
| 84 | if (s[i] === 'e' || s[i] === 'E') { |
| 85 | state = State.EXPONENT_SIGN; |
| 86 | } else if (!isDigit(s[i])) { |
| 87 | break; |
| 88 | } |
| 89 | } else if (state === State.EXPONENT_SIGN) { |
| 90 | if (isDigit(s[i]) || s[i] === '+' || s[i] === '-') { |
| 91 | state = State.EXPONENT; |
| 92 | } else { |
| 93 | break; |
| 94 | } |
| 95 | } else if (state === State.EXPONENT) { |
| 96 | if (!isDigit(s[i])) { |
| 97 | break; |
| 98 | } |
| 99 | } |
| 100 | } |
| 101 | return i; |
| 102 | } |
| 103 | |
| 104 | function isDigit(c: string): boolean { |
| 105 | return '0' <= c && c <= '9'; |
no test coverage detected
searching dependent graphs…