module TestCase5

-- last bit tests pulling solutions from context

data Plus : U -> U where
    MkPlus : {A : U} -> (A -> A -> A) -> Plus A

infixl 7 _+_
_+_ : {A : U} {{_ : Plus A}} -> A -> A -> A
_+_ {{MkPlus plus}} x y = plus x y


pfunc plusInt : Int -> Int -> Int := `(x,y) => x + y`

PlusInt : Plus Int
PlusInt = MkPlus plusInt

-- TODO this needs some aggressive inlining...
double : Int -> Int
double x = x + x

data Nat : U where
    Z : Nat
    S : Nat -> Nat

plus : Nat -> Nat -> Nat
plus Z m = m
plus (S n) m = S (plus n m)

PlusNat : Plus Nat
PlusNat = MkPlus plus

double2 : {A : U} {{foo : Plus A}} -> A -> A
double2 = \ a => a + a

