module Equality

data Eq : {A : U} -> A -> A -> U where
  Refl : {A : U} {a : A} -> Eq a a

-- Some magic is not happening here.

sym : {A : U} {x y : A} -> Eq x y -> Eq y x
sym Refl = Refl

trans : {A : U} {x y z : A} -> Eq x y -> Eq y z -> Eq x z
trans Refl Refl = Refl

coerce : {A B : U} -> Eq A B -> A -> B
coerce Refl a = a

J : {A : U} ->
    {C : (x y : A) -> Eq x y -> U} ->
    (c : (x : _) -> C x x Refl) ->
    (x y : A) ->
    (p : Eq x y) ->
    C x y p
-- this was failing until I constrained scrutinee to the constructor + args
J c x y Refl = c x
