def Decimal.read.step

bend-kit-bignum@0.1.0.0 · decimal.bend:314

import bend-kit-bignum@0.1.0.0/decimal.bend as Decimal
import Base

314def Decimal.read.step(st: Scan, cl: Class) -> Scan:
315  match st:
316    case Begin{}:
317      match cl:
318        case Digit{c}:
319          Whole{False{}, Decimal.read.push(c, SNil{})}
320        case Minus{}:
321          Signed{True{}}
322        case Plus{}:
323          Signed{False{}}
324        case _:
325          Bad{}
326    case Signed{neg}:
327      match cl:
328        case Digit{c}:
329          Whole{neg, Decimal.read.push(c, SNil{})}
330        case _:
331          Bad{}
332    case Whole{neg, ds}:
333      match cl:
334        case Digit{c}:
335          Whole{neg, Decimal.read.push(c, ds)}
336        case Point{}:
337          Dot{neg, ds}
338        case Expo{}:
339          Exp{neg, ds, 0n}
340        case _:
341          Bad{}
342    case Dot{neg, ds}:
343      match cl:
344        case Digit{c}:
345          Frac{neg, Decimal.read.push(c, ds), 1n}
346        case _:
347          Bad{}
348    case Frac{neg, ds, sc}:
349      match cl:
350        case Digit{c}:
351          Frac{neg, Decimal.read.push(c, ds), 1n+sc}
352        case Expo{}:
353          Exp{neg, ds, sc}
354        case _:
355          Bad{}
356    case Exp{neg, ds, sc}:
357      match cl:
358        case Digit{c}:
359          ExpDigits{neg, ds, sc, False{}, U32.sub(c, 48)}
360        case Minus{}:
361          ExpSigned{neg, ds, sc, True{}}
362        case Plus{}:
363          ExpSigned{neg, ds, sc, False{}}
364        case _:
365          Bad{}
366    case ExpSigned{neg, ds, sc, eneg}:
367      match cl:
368        case Digit{c}:
369          ExpDigits{neg, ds, sc, eneg, U32.sub(c, 48)}
370        case _:
371          Bad{}
372    case ExpDigits{neg, ds, sc, eneg, e}:
373      match cl:
374        case Digit{c}:
375          +x = (e * 10 + c - 48 : U32)
376          Decimal.read.exp(U32.is_gt(x, 100000), neg, ds, sc, eneg, x)
377        case _:
378          Bad{}
379    case _:
380      Bad{}

Uses (12)

Used by (1)