def rd.graves

bend-kit-runner@0.13.0.1 · runner.bend:791

import bend-kit-runner@0.13.0.1/runner.bend as Runner
import Base
import bend-kit-bytes@0.3.3.0/bytes.bend as Bytes
import bend-kit-collections@0.1.4.1/hmap.bend as M

791# A trie node whose kind is already read: nil is kind 0, leaf kind 1, and branch kind 2. Any other kind fails.
792def rd.graves(~A: Data, ~pdec: Bytes.Bytes -> Maybe<&2, A>, +fuel: Nat, nil: Bool, leaf: Bool, branch: Bool) -> Dec(Graves(A)):
793  match fuel nil leaf branch:
794    case 0n a b c:
795      Dec.fail(Graves(A))
796    case 1n+f True{} b c:
797      Dec.pure(Graves(A), M.HNil{})
798    case 1n+f False{} True{} c:
799      do Dec<Graves(A)>:
800        h : U32 <- rd.u32()
801        m : Bool <- rd.flag()
802        es : List<&2, M.Entry<Nat, Dead<A>>> <- rd.entries(~A, ~pdec, f, m)
803        return M.HLeaf{h, es}
804    case 1n+f False{} False{} True{}:
805      do Dec<Graves(A)>:
806        +lk : U32 <- rd.u32()
807        lo : Graves(A) <- rd.graves(~A, ~pdec, f, U32.is_eq(lk, 0), U32.is_eq(lk, 1), U32.is_eq(lk, 2))
808        +hk : U32 <- rd.u32()
809        hi : Graves(A) <- rd.graves(~A, ~pdec, f, U32.is_eq(hk, 0), U32.is_eq(hk, 1), U32.is_eq(hk, 2))
810        return M.HBranch{lo, hi}
811    case 1n+f False{} False{} False{}:
812      Dec.fail(Graves(A))

Uses (18)

Used by (1)