{-# OPTIONS --without-K #-}

module function.surjective where

open import sum
open import equality
open import function.isomorphism.core
open import hott.level.core
open import hott.equivalence.core
open import hott.truncation.core

surjective :  {i j}{A : Set i}{B : Set j}  (A  B)  Set _
surjective f =  b  Trunc 1 (f ⁻¹ b)

retr⇒surj :  {i j}{A : Set i}{B : Set j}
           (f : A  B)
           retraction f
           surjective f
retr⇒surj f retr b = [ retr b ]

inj+surj⇒eq :  {i j}{A : Set i}{B : Set j}
             h 2 A  h 2 B
             (f : A  B)
             injective f
             surjective f
             weak-equiv f
inj+surj⇒eq {A = A}{B = B} hA hB f inj surj b = retr-f b , propFib b (retr-f b)
  where
    propFib : (b : B)  prop (f ⁻¹ b)
    propFib b (a , p) (a' , p') = unapΣ (inj (p · sym p') , h1⇒prop (hB (f a') b) _ _)

    retr-f : retraction f
    retr-f b = Trunc-elim 1 _ _ (prop⇒h1 (propFib b))  x  x) (surj b)