/-- The free/forgetful adjunction between `PointedToBipointed_fst` and `BipointedToPointed_fst`.
-/
def pointedToBipointedFstBipointedToPointedFstAdjunction :
    pointedToBipointedFst ⊣ bipointedToPointedFst :=
  Adjunction.mkOfHomEquiv
    { homEquiv := fun X Y =>
        { toFun := fun f => ⟨f.toFun ∘ Option.some, f.map_fst⟩
          invFun := fun f => ⟨fun o => o.elim Y.toProd.2 f.toFun, f.map_point, rfl⟩
          left_inv := fun f => by
            apply Bipointed.Hom.ext
            funext x
            cases x
            · exact f.map_snd.symm
            · rfl
          right_inv := fun f => Pointed.Hom.ext _ _ rfl }
      homEquiv_naturality_left_symm := fun f g => by
        apply Bipointed.Hom.ext
        funext x
        

Proof state:
case toFun.h
α : Type u_1
β : Type u_2
X'✝ X✝ : Pointed
Y✝ : Bipointed
f : X'✝ ⟶ X✝
g : X✝ ⟶ bipointedToPointedFst.obj Y✝
x : (pointedToBipointedFst.obj X'✝).X
⊢ Bipointed.Hom.toFun
      (((fun X Y =>
              {
                toFun := fun f =>
                  { toFun := f.toFun ∘ some,
                    map_point := (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) },
                invFun := fun f =>
                  { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                    map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                    map_snd :=
                      (_ :
                        (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2 =
                          (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2) },
                left_inv :=
                  (_ :
                    ∀ (f : pointedToBipointedFst.obj X ⟶ Y),
                      (fun f =>
                            { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                              map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                              map_snd :=
                                (_ :
                                  (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2 =
                                    (fun o => Option.elim o Y.toProd.2 f.toFun)
                                      (pointedToBipointedFst.obj X).toProd.2) })
                          ((fun f =>
                              { toFun := f.toFun ∘ some,
                                map_point :=
                                  (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) })
                            f) =
                        f),
                right_inv :=
                  (_ :
                    ∀ (f : X ⟶ bipointedToPointedFst.obj Y),
                      (fun f =>
                            { toFun := f.toFun ∘ some,
                              map_point :=
                                (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) })
                          ((fun f =>
                              { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                                map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                                map_snd :=
                                  (_ :
                                    (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2 =
                                      (fun o => Option.elim o Y.toProd.2 f.toFun)
                                        (pointedToBipointedFst.obj X).toProd.2) })
                            f) =
                        f) })
            X'✝ Y✝).symm
        (f ≫ g))
      x =
    Bipointed.Hom.toFun
      (pointedToBipointedFst.map f ≫
        ((fun X Y =>
                {
                  toFun := fun f =>
                    { toFun := f.toFun ∘ some,
                      map_point := (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) },
                  invFun := fun f =>
                    { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                      map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                      map_snd :=
                        (_ :
                          (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2 =
                            (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2) },
                  left_inv :=
                    (_ :
                      ∀ (f : pointedToBipointedFst.obj X ⟶ Y),
                        (fun f =>
                              { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                                map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                                map_snd :=
                                  (_ :
                                    (fun o => Option.elim o Y.toProd.2 f.toFun) (pointedToBipointedFst.obj X).toProd.2 =
                                      (fun o => Option.elim o Y.toProd.2 f.toFun)
                                        (pointedToBipointedFst.obj X).toProd.2) })
                            ((fun f =>
                                { toFun := f.toFun ∘ some,
                                  map_point :=
                                    (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) })
                              f) =
                          f),
                  right_inv :=
                    (_ :
                      ∀ (f : X ⟶ bipointedToPointedFst.obj Y),
                        (fun f =>
                              { toFun := f.toFun ∘ some,
                                map_point :=
                                  (_ : Bipointed.Hom.toFun f (pointedToBipointedFst.obj X).toProd.1 = Y.toProd.1) })
                            ((fun f =>
                                { toFun := fun o => Option.elim o Y.toProd.2 f.toFun,
                                  map_fst := (_ : Pointed.Hom.toFun f X.point = (bipointedToPointedFst.obj Y).point),
                                  map_snd :=
                                    (_ :
                                      (fun o => Option.elim o Y.toProd.2 f.toFun)
                                          (pointedToBipointedFst.obj X).toProd.2 =
                                        (fun o => Option.elim o Y.toProd.2 f.toFun)
                                          (pointedToBipointedFst.obj X).toProd.2) })
                              f) =
                          f) })
              X✝ Y✝).symm
          g)
      x

Next tactic:
cases x