/-- We can apply a functor `F : C ⥤ D` to the values of the presheaf in any `PresheafedSpace C`,
    giving a functor `PresheafedSpace C ⥤ PresheafedSpace D` -/
def mapPresheaf (F : C ⥤ D) : PresheafedSpace C ⥤ PresheafedSpace D where
  obj X :=
    { carrier := X.carrier
      presheaf := X.presheaf ⋙ F }
  map f :=
    { base := f.base
      c := whiskerRight f.c F }
  -- porting note: these proofs were automatic in mathlib3
  map_id X := by
    ext U
    rfl
    simp
  map_comp f g := by
    ext U
    

Proof state:
case w.w
C : Type u_1
inst✝¹ : Category.{?u.299389, u_1} C
D : Type u_2
inst✝ : Category.{?u.299396, u_2} D
F : C ⥤ D
X✝ Y✝ Z✝ : PresheafedSpace C
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
U :
  (forget TopCat).obj
    ↑({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
            map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.obj
        X✝)
⊢ ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
              map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
          (f ≫ g)).base
      U =
    ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
            f ≫
          { obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
            g).base
      U
case h.w
C : Type u_1
inst✝¹ : Category.{?u.299389, u_1} C
D : Type u_2
inst✝ : Category.{?u.299396, u_2} D
F : C ⥤ D
X✝ Y✝ Z✝ : PresheafedSpace C
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
U :
  Opens
    ↑↑({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
              map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.obj
          Z✝)
⊢ (({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                  map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
              (f ≫ g)).c ≫
          whiskerRight
            (eqToHom
              (_ :
                (Opens.map
                      ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                              map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
                          (f ≫ g)).base).op =
                  (Opens.map
                      ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                                map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
                            f ≫
                          { obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                                map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
                            g).base).op))
            ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                    map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.obj
                X✝).presheaf).app
      (op U) =
    ({ obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                  map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
              f ≫
            { obj := fun X => { carrier := ↑X, presheaf := X.presheaf ⋙ F },
                  map := fun {X Y} f => { base := f.base, c := whiskerRight f.c F } }.map
              g).c.app
      (op U)

Next tactic:
rfl