module Quox.Thin.Coprod import public Quox.Thin.Base import public Quox.Thin.Comp import public Quox.Thin.View import public Quox.Thin.List import public Quox.Thin.Cover import Data.DPair %default total public export record Coprod2 (ope1 : OPE m1 n mask1) (ope2 : OPE m2 n mask2) where constructor MkCoprod2 {sizeMask : Nat} {leftMask : Nat} {rightMask : Nat} {0 sub : OPE size n sizeMask} {0 left : OPE m1 size leftMask} {0 right : OPE m2 size rightMask} 0 leftComp : Comp sub left ope1 0 rightComp : Comp sub right ope2 {auto 0 isCover : Cover [left, right]} %name Coprod2 cop export coprod2 : {n, mask1, mask2 : Nat} -> (0 ope1 : OPE m1 n mask1) -> (0 ope2 : OPE m2 n mask2) -> Coprod2 ope1 ope2 coprod2 ope1 ope2 with (view ope1) | (view ope2) coprod2 Stop Stop | StopV | StopV = MkCoprod2 StopZ StopZ coprod2 (Drop ope1 Refl) (Drop ope2 Refl) | DropV _ ope1 | DropV _ ope2 = let MkCoprod2 l r = coprod2 ope1 ope2 in MkCoprod2 (DropZ l) (DropZ r) coprod2 (Drop ope1 Refl) (Keep ope2 Refl) | DropV _ ope1 | KeepV _ ope2 = let MkCoprod2 l r = coprod2 ope1 ope2 in MkCoprod2 (KDZ l) (KeepZ r) coprod2 (Keep ope1 Refl) (Drop ope2 Refl) | KeepV _ ope1 | DropV _ ope2 = let MkCoprod2 l r = coprod2 ope1 ope2 in MkCoprod2 (KeepZ l) (KDZ r) coprod2 (Keep ope1 Refl) (Keep ope2 Refl) | KeepV _ ope1 | KeepV _ ope2 = let MkCoprod2 l r = coprod2 ope1 ope2 in MkCoprod2 (KeepZ l) (KeepZ r) -- [todo] n-ary coprod