\import Algebra.Pointed
\import Paths
\import Set.SetHom

\record PointedHom \extends SetHom {
  \override Dom : Pointed
  \override Cod : Pointed
  | func-ide : func ide = ide
} \where {
  \func id {X : Pointed} : PointedHom X X \cowith
    | func x => x
    | func-ide => idp

  \func \fixl 8 compose \alias \infixl 8  {X Y Z : Pointed} (g : PointedHom Y Z) (f : PointedHom X Y) : PointedHom X Z \cowith
    | func x => g (f x)
    | func-ide => pmap g f.func-ide *> g.func-ide
}

\record AddPointedHom \extends SetHom {
  \override Dom : AddPointed
  \override Cod : AddPointed
  | func-zro : func zro = zro
} \where {
  \func id (X : AddPointed) : AddPointedHom X X \cowith
    | func x => x
    | func-zro => idp

  \func \fixl 8 compose \alias \infixl 8  {A B C : AddPointed} (g : AddPointedHom B C) (f : AddPointedHom A B) : AddPointedHom A C \cowith
    | func x => g (f x)
    | func-zro => pmap g f.func-zro *> g.func-zro
}