{-# OPTIONS --safe #-}
open import Prelude.Init
module Prelude.Maybes where
private variable A : Type
open M
Any-just : ∀ {x : A} {mx : Maybe A} {P : A → Type}
→ mx ≡ just x
→ M.Any.Any P mx
→ P x
Any-just refl (M.Any.just p) = p
Any⇒Is-just : ∀ {mx : Maybe A} {P : A → Type}
→ M.Any.Any P mx
→ Is-just mx
Any⇒Is-just {mx = .(just _)} (M.Any.just _) = M.Any.just tt
module _ {A : Type ℓ} where
is-just≡ : ∀ {mx : Maybe A} → T (M.is-just mx) → ∃ λ x → mx ≡ just x
is-just≡ {mx = just _} _ = -, refl
¬is-just≡ : ∀ {mx : Maybe A} → ¬ T (M.is-just mx) → mx ≡ nothing
¬is-just≡ {mx = just _} p = ⊥-elim $ p tt
¬is-just≡ {mx = nothing} _ = refl
Is-just? : (mx : Maybe A) → Dec (Is-just mx)
Is-just? = M.Any.dec λ _ → yes tt
Is-just⇒≢nothing : ∀ {mx : Maybe A} → Is-just mx → mx ≢ nothing
Is-just⇒≢nothing {mx = nothing} () _
Is-just⇒≢nothing {mx = just _} _ ()
Is-nothing≡ : ∀ {mx : Maybe A} → Is-nothing mx → mx ≡ nothing
Is-nothing≡ {mx = nothing} _ = refl
Is-nothing≡ {mx = just _} (M.All.just ())
¬Is-just⇒Is-nothing : ∀ {mx : Maybe A} → ¬ Is-just mx → Is-nothing mx
¬Is-just⇒Is-nothing {mx = nothing} _ = M.All.nothing
¬Is-just⇒Is-nothing {mx = just _} p = ⊥-elim $ p (M.Any.just tt)
destruct-Is-just : ∀ {mx : Maybe A}
→ Is-just mx
→ ∃ λ x → mx ≡ just x
destruct-Is-just {mx = nothing} ()
destruct-Is-just {mx = just _} _ = _ , refl
MAll⇒¬MAny : ∀ {m : Maybe A} → M.All.All (const ⊥) m → ¬ M.Any.Any (const ⊤) m
MAll⇒¬MAny {m = nothing} M.All.nothing ()
mk-Is-just : ∀ {mx : Maybe A} {x : A} → mx ≡ just x → Is-just mx
mk-Is-just refl = M.Any.just tt
destruct-Any-just : ∀ {mx : Maybe A} {P : A → Type}
→ M.Any.Any P mx
→ ∃ λ x → mx ≡ just x × P x
destruct-Any-just ∃p =
let x , x≡ = destruct-Is-just (Any⇒Is-just ∃p)
in x , x≡ , Any-just x≡ ∃p