{-# OPTIONS --without-K #-}
module segal.preliminaries where

open import equality
open import hott.level
open import function.isomorphism
open import function.extensionality
open import function.fibration
open import level
open import sum

module _ {i} {A : Set i} where
  private
    Singleton : Set (lsuc i)
    Singleton = Σ (A → Set i) λ P → contr (Σ A P)

    f : A → Singleton
    f a = ((λ b → a ≡ b), singl-contr a)

    g : Singleton → A
    g (_ , (a , _) , _) = a

    α : (a : A) → g (f a) ≡ a
    α a = refl

    β : (s : Singleton) → f (g s) ≡ s
    β (P , (x , p) , h) = unapΣ (lem , h1⇒prop (hn-h1 0 _) _ _)
      where
        t-iso : singleton x ≅ Σ A P
        t-iso = contr-⊤-iso (singl-contr x)
              ·≅ sym≅ (contr-⊤-iso ((x , p), h))

        t-iso-β : (b : A)(p : x ≡ b) → proj₁ (apply≅ t-iso (b , p)) ≡ b
        t-iso-β .x refl = refl

        lem : (λ b → x ≡ b) ≡ P
        lem = funext λ b → ≅⇒≡ (family-eq-iso t-iso t-iso-β b)

  contr-predicate : Singleton ≅ A
  contr-predicate = iso g f β α

  contr-predicate-η : (a : A) → proj₁ (invert≅ contr-predicate a) ≡ (λ b → a ≡ b)
  contr-predicate-η a = refl

  add-contr : {B : A → Set i}
            → ((a : A) → contr (B a))
            → A ≅ Σ A B
  add-contr {B = B} hB = sym≅ (  Σ-ap-iso₂ (λ a → contr-⊤-iso (hB a))
                              ·≅ ×-right-unit)

module _ {i} {A B : Set i} where
  iso-adjunct : {a : A}{b : B}(φ : A ≅ B)
              → apply≅ φ a ≡ b
              → a ≡ invert≅ φ b
  iso-adjunct {a} φ p = sym (_≅_.iso₁ φ a) · ap (invert≅ φ) p