\import Homotopy.Space
\import Logic
\import Meta
\import Paths
\import Paths.Meta
\class Pointed \extends InhSpace
| base : E
| isInh => inP base
\where
\func make {E : \Type} (e : E) => \new Pointed E e
\instance UnitPointed : Pointed (\Sigma)
| base => ()
\func \infixr 1 ->* (A B : Pointed) => \Sigma (f : A -> B) (f base = base)
\where {
\func ext {A B : Pointed} {f g : A ->* B} (p : \Pi (x : A) -> f.1 x = g.1 x) (q : p base *> g.2 = f.2) : f = g =>
\let | p' => path (\lam i x => p x @ i)
| q' => Jl (\lam _ p'' => (rewrite p'' in f.2) = inv (pmap (\lam (h : A -> B) => h base) p'') *> f.2)
(inv (idp_*> _)) p' *> rotatePathLeft (inv q)
\in path (\lam i => (p' @ i, pathOver q' @ i))
}