{-# 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