def next.go

emerging-ezjson@1.3.0.0 · src/pull.bend:1451

import emerging-ezjson@1.3.0.0/src/pull.bend as Pull
import Base
import emerging-ezjson@1.3.0.0/src/lex.bend as Lex

1451# one character, between events. A plain word is one tail loop. A finished
1452# event returns; everything else tail-calls on the shorter suffix. A string
1453# character and a bracket are not handed to the step twice, so a long row or
1454# a long array moves the suffix instead of keeping it
1455def next.go(fuel: Nat, txt: String, st: St) -> Out:
1456  match fuel txt st:
1457    case n any S{MDone{stop, saved}, stack, goal, done, bad}:
1458      Fin{(stop, Cur{saved, stack, done, bad})}
1459    case n txt S{MRest{stop}, stack, goal, done, bad}:
1460      Fin{(stop, Cur{txt, stack, done, bad})}
1461    case 0n any S{mode, stack, goal, done, bad}:
1462      More{any, S{mode, stack, goal, done, bad}}
1463    case 1n+left any S{MJump{rest, mode}, stack, goal, done, bad}:
1464      next.go(left, rest, S{mode, stack, goal, done, bad})
1465    case 1n+left SNil{} S{MQuote{}, stack, goal, done, bad}:
1466      Fin{bad.cur()}
1467    case 1n+left SCon{ch, tl} S{MQuote{}, stack, goal, done, True{}}:
1468      next.go(1n+left, tl, err.st(goal))
1469    case 1n+left SCon{ch, +tl} S{MQuote{}, stack, goal, done, False{}}:
1470      next.go(1n+left, tl, quote.first(ch, tl, stack, goal, done))
1471    case 1n+left SNil{} S{MIdle{}, stack, goal, done, bad}:
1472      Fin{idle.eof(stack, goal, done, bad)}
1473    case 1n+left SCon{ch, tl} S{MIdle{}, stack, goal, done, True{}}:
1474      next.go(1n+left, tl, err.st(goal))
1475    case 1n+left SCon{ch, tl} S{MIdle{}, stack, goal, done, False{}}:
1476      next.go(1n+left, tl, look.plan(ch, stack, goal, done, Lex.classify(ch)))
1477    case 1n+left txt S{MWord{buf, nn, num}, stack, goal, done, bad}:
1478      next.go(left, "", word.burst(txt, buf, nn, num, stack, goal, bad))
1479    case 1n+left SNil{} S{MSpan{cut, nn}, stack, goal, done, bad}:
1480      Fin{bad.cur()}
1481    case 1n+left SCon{ch, tl} S{MSpan{cut, nn}, stack, goal, done, True{}}:
1482      next.go(1n+left, tl, err.st(goal))
1483    case 1n+left SCon{ch, tl} S{MSpan{cut, nn}, stack, goal, done, False{}}:
1484      next.go(1n+left, tl, span.advance(span.kind.of(ch), cut, nn, stack, goal, done))
1485    case 1n+left SNil{} S{MCopy{buf}, stack, goal, done, bad}:
1486      Fin{bad.cur()}
1487    case 1n+left SCon{+ch, +tl} S{MCopy{buf}, stack, goal, done, bad}:
1488      next.go(1n+left, tl, copy.hit(ch, tl, buf, stack, goal, done, bad, Lex.classify(ch),
1489        U32.is_lt(Char.to_u32(ch), 32)))
1490    case 1n+left SNil{} S{MEsc{buf}, stack, goal, done, bad}:
1491      Fin{bad.cur()}
1492    case 1n+left SCon{+ch, +tl} S{MEsc{buf}, stack, goal, done, bad}:
1493      next.go(1n+left, tl, esc.hit(ch, tl, buf, stack, goal, done, bad))
1494    case 1n+left SNil{} S{MUni{left2, acc, buf}, stack, goal, done, bad}:
1495      Fin{bad.cur()}
1496    case 1n+left SCon{+ch, +tl} S{MUni{left2, acc, buf}, stack, goal, done, bad}:
1497      next.go(1n+left, tl, uni.hit(ch, tl, left2, acc, buf, stack, goal, done, bad))
1498    case 1n+left SNil{} S{MHi{hi, buf}, stack, goal, done, bad}:
1499      Fin{bad.cur()}
1500    case 1n+left SCon{ch, tl} S{MHi{hi, buf}, stack, goal, done, bad}:
1501      next.go(1n+left, tl, hi.hit(tl, hi, buf, stack, goal, done, bad, Lex.classify(ch)))
1502    case 1n+left SNil{} S{MHiEsc{hi, buf}, stack, goal, done, bad}:
1503      Fin{bad.cur()}
1504    case 1n+left SCon{+ch, tl} S{MHiEsc{hi, buf}, stack, goal, done, bad}:
1505      next.go(1n+left, tl, hiesc.hit(ch, tl, hi, buf, stack, goal, done, bad))
1506    case 1n+left SNil{} S{MLo{left2, acc, hi, buf}, stack, goal, done, bad}:
1507      Fin{bad.cur()}
1508    case 1n+left SCon{+ch, +tl} S{MLo{left2, acc, hi, buf}, stack, goal, done, bad}:
1509      next.go(1n+left, tl, lo.hit(ch, tl, left2, acc, hi, buf, stack, goal, done, bad))
1510    case 1n+left SNil{} S{MSkStr{}, stack, goal, done, bad}:
1511      Fin{bad.cur()}
1512    case 1n+left SCon{ch, tl} S{MSkStr{}, stack, goal, done, True{}}:
1513      next.go(1n+left, tl, err.st(goal))
1514    case 1n+left SCon{ch, tl} S{MSkStr{}, stack, goal, done, False{}}:
1515      next.go(1n+left, tl, sk.advance(span.kind.of(ch), stack, goal, done))
1516    case 1n+left SNil{} S{MSkEsc{}, stack, goal, done, bad}:
1517      Fin{bad.cur()}
1518    case 1n+left SCon{+ch, tl} S{MSkEsc{}, stack, goal, done, bad}:
1519      next.go(1n+left, tl, sk.esc(ch, tl, stack, goal, done, bad))
1520    case 1n+left SNil{} S{MSkUni{left2, acc}, stack, goal, done, bad}:
1521      Fin{bad.cur()}
1522    case 1n+left SCon{+ch, tl} S{MSkUni{left2, acc}, stack, goal, done, bad}:
1523      next.go(1n+left, tl, sk.uni(ch, tl, left2, acc, stack, goal, done, bad))
1524    case 1n+left SNil{} S{MSkHi{hi}, stack, goal, done, bad}:
1525      Fin{bad.cur()}
1526    case 1n+left SCon{ch, tl} S{MSkHi{hi}, stack, goal, done, bad}:
1527      next.go(1n+left, tl, sk.hi(stack, goal, done, hi, Lex.classify(ch)))
1528    case 1n+left SNil{} S{MSkHiEsc{hi}, stack, goal, done, bad}:
1529      Fin{bad.cur()}
1530    case 1n+left SCon{+ch, tl} S{MSkHiEsc{hi}, stack, goal, done, bad}:
1531      next.go(1n+left, tl, sk.hiesc(stack, goal, done, hi, U32.is_eq(Char.to_u32(ch), 117)))
1532    case 1n+left SNil{} S{MSkLo{left2, acc, hi}, stack, goal, done, bad}:
1533      Fin{bad.cur()}
1534    case 1n+left SCon{+ch, tl} S{MSkLo{left2, acc, hi}, stack, goal, done, bad}:
1535      next.go(1n+left, tl, sk.lo.go(ch, tl, left2, acc, hi, stack, goal, done,
1536        Lex.hex.ok(Char.to_u32(ch))))

Uses (33)

Used by (1)