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{}