1 import Base 2 import ./decode_data.bend as D 3 import ./decode_size.bend as Size 4 5 # decode_owner uses the one Raw returned by the closed actual-owner projection. 6 # decode_budget is a trusted low-level helper taking separate Raw, fuel and owner. 7 # decode_owner derives structural fuel and does not invent a Raw-to-Owner inverse. 8 def decode_budget(~Owner:Type,+codec:D.Codec,raw:D.Raw,+fuel:Nat,owner:Owner) -> D.Receipt: 9 D.normalized(~Owner,fuel,codec,D.owned(~Owner,fuel,codec,D.Owned{owner,raw})) 10 def decode_projected(~Owner:Type,+codec:D.Codec,observed:Owner & D.Raw) -> D.Receipt: 11 match observed: 12 case (owner,+raw): decode_budget(~Owner,codec,raw,Size.budget(codec,raw),owner) 13 def decode_owner(~Owner:Type,~project:Owner -> Owner & D.Raw,codec:D.Codec,owner:Owner) -> D.Receipt: 14 decode_projected(~Owner,codec,project(owner))