module Encoded.Sum import public Data.SnocList.Operations import Encoded.Bool import Encoded.Pair import Encoded.Union import Term.Syntax -- Binary Sums ----------------------------------------------------------------- export (+) : Ty -> Ty -> Ty ty1 + ty2 = B * (ty1 <+> ty2) export left : {ty1, ty2 : Ty} -> Term (ty1 ~> (ty1 + ty2)) ctx left = Abs' (\t => App pair [ Term (ty2 ~> (ty1 + ty2)) ctx right = Abs' (\t => App pair [ Term ((ty1 + ty2) ~> (ty1 ~> ty) ~> (ty2 ~> ty) ~> ty) ctx case' = Abs' (\t => App if' [ Term ((ty1 ~> ty) ~> (ty2 ~> ty) ~> (ty1 + ty2) ~> ty) ctx either = Abs $ Abs $ Abs $ let f = Var $ There $ There Here in let g = Var $ There Here in let x = Var Here in App case' [ NonEmpty (map f sx) mapNonEmpty IsSnoc = IsSnoc export Sum : (sty : SnocList Ty) -> {auto 0 ok : NonEmpty sty} -> Ty Sum [ {ty : Ty} -> {auto 0 ok : NonEmpty sty} -> Term (map (~> ty) sty ~>* Sum sty ~> ty) ctx any {sty = [ {ty : Ty} -> {auto 0 ok : NonEmpty sty} -> Elem ty sty -> Term (ty ~> Sum sty) ctx tag {sty = [