0 | module Control.Lens.Equality
2 | import Control.Lens.Optic
15 | record IsEquality {0 k,k' : _} (p : k -> k' -> Type) where
16 | constructor MkIsEquality
26 | 0 Equality : k -> k' -> k -> k' -> Type
27 | Equality s t a b = forall p. IsEquality p => p a b -> p s t
32 | 0 Equality' : (s,a : k) -> Type
33 | Equality' = Simple Equality
43 | runEq : Equality s t a b -> (s = a, t = b)
44 | runEq l = (l {p = \x,_ => x = a} Refl,
45 | l {p = \_,y => y = b} Refl)
49 | runEq' : Equality s t a b -> s = a
50 | runEq' l = l {p = \x,_ => x = a} Refl
55 | congEq : forall f,g. Equality s t a b -> Equality (f s) (g t) (f a) (g b)
56 | congEq l {p} = l {p = \x,y => p (f x) (g y)}
60 | symEq : Equality s t a b -> Equality b a t s
61 | symEq l = case runEq l of (Refl, Refl) => id
64 | substEq : forall p. Equality s t a b -> p a b a b -> p s t a b
65 | substEq {p} l = l {p = \x,y => p x y a b}
71 | simple : Equality' a a