def num.go

lawful-fields@0.1.1.0 · fields.bend:53

import lawful-fields@0.1.1.0/fields.bend as Fields
import Base
import lawful-bytes@0.1.1.0/defs.bend as D
import lawful-bytes@0.1.1.0/bytes.bend as B

53# r holds byte j; acc is the value so far; ok says every byte was a digit and
54# nothing overflowed.
55def num.go(n: Nat, r: D.Bytes & U32, +j: U32, +acc: U32, ok: Bool) -> D.Bytes & Maybe<&2, U32>:
56  match n:
57    case 0n:
58      num.out(acc, ok, r)
59    case 1n+m:
60      (b, +x) = r
61      +d = (x - 48 : U32)
62      +digit = U32.is_ge(x, 48) && U32.is_le(x, 57)
63      +fits = U32.is_lt(acc, 429496729) || (U32.is_eq(acc, 429496729) && U32.is_le(d, 5))
64      num.go(m, B.at(b, (j + 1 : U32)), (j + 1 : U32), ((acc * 10 : U32) + d : U32), ok && (digit && fits))

Uses (18)

Used by (4)