Library zoo_persistent.pqueue

Require Import zoo.prelude.
Require Import zoo.common.list.
Require Import zoo.base.
Require Import zoo_std.option.
Require Export zoo_persistent.pqueue__code.
Require Import zoo_persistent.pqueue__types.
Require Import zoo.options.

Implicit Type v t : val.
Implicit Type back front : list val.

Section zoo۰G.
  Context `{zoo۰G : !ZooG Σ}.

  Definition pqueue۰model t vs : iProp Σ :=
     front back,
    t = (list۰to_val front, list۰to_val back)%V vs = front ++ reverse back.

  #[global] Instance pqueue۰modeltimeless t vs :
    Timeless (pqueue۰model t vs).

  #[global] Instance pqueue۰modelpersistent t vs :
    Persistent (pqueue۰model t vs).

  Lemma pqueue۰modelnil :
     pqueue۰model pqueue٠empty [].

  Lemma pqueue٠is_emptyspec t vs :
    {{{
      pqueue۰model t vs
    }}}
      pqueue٠is_empty t
    {{{
      RET #(bool_decide (vs = []%list));
      True
    }}}.

  Lemma pqueue٠pushspec t vs v :
    {{{
      pqueue۰model t vs
    }}}
      pqueue٠push t v
    {{{
      t'
    , RET t';
      pqueue۰model t' (vs ++ [v])
    }}}.

  Lemma pqueue٠popspec t vs :
    {{{
      pqueue۰model t vs
    }}}
      pqueue٠pop t
    {{{
      o
    , RET o;
      match o with
      | None
          vs = []
      | Some p
           v vs' t',
          vs = v :: vs'
          p = (v, t')%V
          pqueue۰model t' vs'
      end
    }}}.
End zoo۰G.

Require zoo_persistent.pqueue__opaque.

#[global] Opaque pqueue۰model.