41 lines
1.5 KiB
Idris
41 lines
1.5 KiB
Idris
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
|