Library zoo_std.option

Require Import zoo.prelude.
Require Import zoo.base.
Require Import zoo.options.

Implicit Type o : option val.
Implicit Type v : val.

Coercion option۰to_val o :=
  match o with
  | None
      §None
  | Some v
      Some( v )
  end%V.
#[global] Arguments option۰to_val !_ / : assert.

#[global] Instance option۰to_valinj :
  Inj (=) (=) option۰to_val.

Lemma option۰to_valsimilarNonel o :
  §None%V o
  o = None.
Lemma option۰to_valsimilarNoner o :
  (o : val) §None%V
  o = None.

Section zoo۰G.
  Context `{zoo۰G : !ZooG Σ}.
  Context τ `{!iType (iPropI Σ) τ}.

  Definition itype۰option t : iProp Σ :=
      t = §None%V
     v,
      t = Some( v )%V
      τ v.
  #[global] Instance itype۰optionitype :
    iType _ itype۰option.

  Lemma wpmatchoption t e1 x e2 Φ :
    itype۰option t -∗
    ( WP e1 {{ Φ }}
       v, τ v -∗ WP subst' x v e2 {{ Φ }}
    ) -∗
    WP 𝗺𝗮𝘁𝗰𝗵 t 𝘄𝗶𝘁𝗵 None e1 | Some x e2 𝗲𝗻𝗱 {{ Φ }}.
End zoo۰G.