{-# OPTIONS --safe #-}
module Cubical.Relation.Nullary.HLevels where

open import Cubical.Foundations.Prelude
open import Cubical.Foundations.HLevels
open import Cubical.Foundations.Function
open import Cubical.Functions.Fixpoint

open import Cubical.Relation.Nullary

private
  variable
     : Level
    A : Type 

isPropPopulated : isProp (Populated A)
isPropPopulated = isPropΠ λ x  2-Constant→isPropFixpoint (x .fst) (x .snd)

isPropHSeparated : isProp (HSeparated A)
isPropHSeparated f g i x y a = HSeparated→isSet f x y (f x y a) (g x y a) i

isPropCollapsible≡ : isProp (Collapsible≡ A)
isPropCollapsible≡ {A = A} f = (isPropΠ2 λ x y  isPropCollapsiblePointwise) f where
  sA : isSet A
  sA = Collapsible≡→isSet f
  gA : isGroupoid A
  gA = isSet→isGroupoid sA
  isPropCollapsiblePointwise :  {x y}  isProp (Collapsible (x  y))
  isPropCollapsiblePointwise {x} {y} (a , ca) (b , cb) = λ i  endoFunction i , endoFunctionIsConstant i where
    endoFunction : a  b
    endoFunction = funExt λ p  sA _ _ (a p) (b p)
    isProp2-Constant : (k : I)  isProp (2-Constant (endoFunction k))
    isProp2-Constant k = isPropΠ2 λ r s  gA x y (endoFunction k r) (endoFunction k s)
    endoFunctionIsConstant : PathP  i  2-Constant (endoFunction i)) ca cb
    endoFunctionIsConstant = isProp→PathP isProp2-Constant ca cb

isPropDiscrete : isProp (Discrete A)
isPropDiscrete p q = isPropΠ2  x y  isPropDec (Discrete→isSet p x y)) p q