import Base import ./main.bend as S import ./payload.bend as P import ./checks.bend as C # Distinct non-scalar payloads exercise actual compiled generic specializations. def term_eq(a: P.Term,b: P.Term) -> Bool: match a: case P.Atom{x}: match b: case P.Atom{y}: U32.is_eq(x,y) case P.ApplyTerm{f,x}: False{} case P.ApplyTerm{f,x}: match b: case P.Atom{y}: False{} case P.ApplyTerm{g,y}: Bool.and(C.id_eq(f,g),C.id_eq(x,y)) def list_eq(xs: List,ys: List) -> Bool: match xs: case Nil{}: match ys: case Nil{}: True{} case Con{y,rest}: False{} case Con{x,rest}: match ys: case Nil{}: False{} case Con{y,tail}: Bool.and(term_eq(x,y),list_eq(rest,tail)) def store_terms() -> Bool: list_eq(P.term_witness(),[P.Atom{17},P.Atom{43},P.ApplyTerm{S.Id{23,0},S.Id{23,1}}]) def terminal(r: Result>) -> Bool: match r: case Fail{e}: False{} case Done{x}: match x: case Fail{e}: False{} case Done{t}: term_eq(t,P.ApplyTerm{S.Id{5,2},S.Id{5,3}}) def observed(p: S.Memo & Result>) -> Bool: (m,r) = p terminal(r) def finished(id: S.Id,p: S.Memo & Result) -> Bool: (m,r) = p Bool.and(C.unit_eq(r,Done{Unit{}}),observed(S.Memo.result(P.Term,String,m,id))) def begun(+id: S.Id,p: S.Memo & Result) -> Bool: (m,r) = p Bool.and(C.unit_eq(r,Done{Unit{}}),finished(id,S.Memo.succeed(P.Term,String,m,id,P.ApplyTerm{S.Id{5,2},S.Id{5,3}}))) def allocated(p: S.Memo & Result) -> Bool: (m,r) = p match r: case Fail{e}: False{} case Done{+id}: begun(id,S.Memo.begin(P.Term,String,m,id)) def ready(r: Result>) -> Bool: match r: case Fail{e}: False{} case Done{m}: allocated(S.Memo.alloc(P.Term,String,m)) def created(p: S.Scopes & Result>) -> Bool: (scopes,r) = p ready(r) def memo_terms() -> Bool: created(S.Memo.new(P.Term,String,S.Scopes.from(5),1))