open import GpdCont.Prelude open import GpdCont.TwoCategory.Base open import GpdCont.TwoCategory.StrictFunctor open import GpdCont.TwoCategory.LocalCategory open import Cubical.Categories.Category.Base open import Cubical.Categories.Functor.Base open import Cubical.Categories.Equivalence.WeakEquivalence using (isWeakEquivalence ; WeakEquivalence) module GpdCont.TwoCategory.StrictFunctor.LocalFunctor {ℓo ℓo′ ℓh ℓh′ ℓr ℓr′} {C : TwoCategory ℓo ℓh ℓr} {D : TwoCategory ℓo′ ℓh′ ℓr′} (F : StrictFunctor C D) where private module C = TwoCategory C module D = TwoCategory D module F = StrictFunctor F C[_,_] = LocalCategory C D[_,_] = LocalCategory D LocalFunctor : (x y : C.ob) → Functor C[ x , y ] D[ F.₀ x , F.₀ y ] LocalFunctor x y .Functor.F-ob = F.₁ LocalFunctor x y .Functor.F-hom = F.₂ LocalFunctor x y .Functor.F-id = F.F-rel-id LocalFunctor x y .Functor.F-seq = F.F-rel-trans Locally : ∀ {ℓ} (P : ∀ {C : Category ℓh ℓr} {D : Category ℓh′ ℓr′} → Functor C D → Type ℓ) → Type _ Locally P = ∀ (x y : C.ob) → P (LocalFunctor x y) isLocallyFullyFaithful : Type _ isLocallyFullyFaithful = Locally Functor.isFullyFaithful isLocallyEssentiallySurjective : Type _ isLocallyEssentiallySurjective = Locally Functor.isEssentiallySurj isLocallySplitEssentiallySurjective : Type _ isLocallySplitEssentiallySurjective = Locally isSplitEssentiallySurjective where isSplitEssentiallySurjective : ∀ {C : Category ℓh ℓr} {D : Category ℓh′ ℓr′} → Functor C D → Type _ isSplitEssentiallySurjective {C} {D} F = (d : D .ob) → Σ[ c ∈ C .ob ] CatIso D (F .F-ob c) d where open Category open Functor localEmbedding : isLocallyFullyFaithful → ∀ {x y : C.ob} (f g : C.hom x y) → C.rel f g ≃ D.rel (F.₁ f) (F.₁ g) localEmbedding is-ff f g .fst = F.₂ localEmbedding is-ff f g .snd = is-ff _ _ f g isLocallyWeakEquivalence : Type _ isLocallyWeakEquivalence = Locally isWeakEquivalence isLocallyFullyFaithful×EssentiallySurjective→isLocallyWeakEquivalence : isLocallyFullyFaithful → isLocallyEssentiallySurjective → isLocallyWeakEquivalence isLocallyFullyFaithful×EssentiallySurjective→isLocallyWeakEquivalence ff eso x y .isWeakEquivalence.fullfaith = ff x y isLocallyFullyFaithful×EssentiallySurjective→isLocallyWeakEquivalence ff eso x y .isWeakEquivalence.esssurj = eso x y localWeakEquivalence : isLocallyWeakEquivalence → ∀ (x y : C.ob) → WeakEquivalence (LocalCategory C x y) (LocalCategory D (F.₀ x) (F.₀ y)) localWeakEquivalence is-weq x y .WeakEquivalence.func = LocalFunctor x y localWeakEquivalence is-weq x y .WeakEquivalence.isWeakEquiv = is-weq x y