{-# OPTIONS --safe #-}
module Data.Maybe.Properties where
open import Prelude
open import Cubical.Foundations.Everything using (JRefl; _≃_; isOfHLevel; isOfHLevelRetract; isProp→isOfHLevelSuc)
open import Data.Unit.UniversePolymorphic.Properties
module MaybePath {ℓ} {A : Type ℓ} where
Cover : Maybe A → Maybe A → Type ℓ
Cover nothing nothing = Poly-⊤
Cover nothing (just _) = Poly-⊥
Cover (just _) nothing = Poly-⊥
Cover (just a) (just a') = a ≡ a'
reflCode : (c : Maybe A) → Cover c c
reflCode nothing = Poly-tt
reflCode (just b) = refl
encode : ∀ c c' → c ≡ c' → Cover c c'
encode c _ = J (λ c' _ → Cover c c') (reflCode c)
encodeRefl : ∀ c → encode c c refl ≡ reflCode c
encodeRefl c = JRefl (λ c' _ → Cover c c') (reflCode c)
decode : ∀ c c' → Cover c c' → c ≡ c'
decode nothing nothing _ = refl
decode (just _) (just _) p = cong just p
decodeRefl : ∀ c → decode c c (reflCode c) ≡ refl
decodeRefl nothing = refl
decodeRefl (just _) = refl
decodeEncode : ∀ c c' → (p : c ≡ c') → decode c c' (encode c c' p) ≡ p
decodeEncode c _ =
J (λ c' p → decode c c' (encode c c' p) ≡ p)
(cong (decode c c) (encodeRefl c) ; decodeRefl c)
encodeDecode : ∀ c c' → (d : Cover c c') → encode c c' (decode c c' d) ≡ d
encodeDecode nothing nothing _ = refl
encodeDecode (just a) (just a') =
J (λ a' p → encode (just a) (just a') (cong just p) ≡ p) (encodeRefl (just a))
Cover≃Path : ∀ c c' → Cover c c' ≃ (c ≡ c')
Cover≃Path c c' = isoToEquiv
(iso (decode c c') (encode c c') (decodeEncode c c') (encodeDecode c c'))
Cover≡Path : ∀ c c' → Cover c c' ≡ (c ≡ c')
Cover≡Path c c' = isoToPath
(iso (decode c c') (encode c c') (decodeEncode c c') (encodeDecode c c'))
isOfHLevelCover : (n : ℕ)
→ isOfHLevel (suc (suc n)) A
→ ∀ c c' → isOfHLevel (suc n) (Cover c c')
isOfHLevelCover n p nothing nothing = isOfHLevelPoly⊤ _
isOfHLevelCover n p nothing (just a') = isProp→isOfHLevelSuc _ λ ()
isOfHLevelCover n p (just a) nothing = isProp→isOfHLevelSuc _ λ ()
isOfHLevelCover n p (just a) (just a') = p a a'
isOfHLevelMaybe : ∀ {ℓ} (n : ℕ) {A : Type ℓ}
→ isOfHLevel (suc (suc n)) A
→ isOfHLevel (suc (suc n)) (Maybe A)
isOfHLevelMaybe n lA c c' =
isOfHLevelRetract (suc n)
(MaybePath.encode c c')
(MaybePath.decode c c')
(MaybePath.decodeEncode c c')
(MaybePath.isOfHLevelCover n lA c c')