\import Category
\import Category.Functor
\import Paths
\import Paths.Meta
\func ObOver {C : Precat} (x : C) => \Sigma (y : C) (Hom y x)
\where {
\protected \func id : ObOver x => (x, C.id)
\sfunc equals {y z : ObOver x} (p : y.1 = z.1) (q : y.2 = z.2 ∘ C.idtoiso p) : y = z
=> Jl (\lam z' p' => \Pi (z2 : Hom z' x) -> y.2 = z2 ∘ C.idtoiso p' -> y = (z',z2)) (\lam z2 q' => pmap {_} {ObOver x} (y.1,__) (q' *> id-right)) p z.2 q
\lemma unequals {y z : ObOver x} (r : y = z) : y.2 = z.2 ∘ C.idtoiso (pmap __.1 r) \elim r
| idp => inv id-right
}
\instance SlicePrecat {C : Precat} (x : C) : Precat (ObOver x)
| Hom (y,f) (z,g) => \Sigma (h : Hom y z) (g ∘ h = f)
| id => (id, id-right)
| o (h1,p1) (h2,p2) => (h1 ∘ h2, inv o-assoc *> pmap (∘ h2) p1 *> p2)
| id-left => ext id-left
| id-right => ext id-right
| o-assoc => ext o-assoc
\where
\lemma forget {C : Precat} (x : C) : FaithfulFunctor (SlicePrecat x) C __.1 __.1 \cowith
| Func-id => idp
| Func-o => idp
| isFaithful p => ext p
\instance SliceCat {C : Cat} (x : C) : Cat
| Precat => SlicePrecat x
| univalence => Cat.makeUnivalence \lam (e : Iso) =>
\have e' => Functor.Func-iso {SlicePrecat.forget x} e
\in (ext (Cat.isotoid e', Cat.transport_Hom_iso-left e' _ (inv e.f.2)), simp_coe (Cat.transport_Hom_iso-right e' _ id-right))