Library zoo_saturn.inf_mpmc_queue_1__code
From zoo Require Import
prelude.
From zoo.language Require Import
typeclasses
notations.
From zoo_std Require Import
inf_array
int
optional
domain.
From zoo_saturn Require Import
inf_mpmc_queue_1__types.
From zoo Require Import
options.
Definition inf_mpmc_queue_1٠create : val :=
fun: ≠ ⇒
{ inf_array٠create §Nothing, 0, 0 }.
Definition inf_mpmc_queue_1٠size : val :=
rec: "size" "t" ⇒
let: "front" := "t".{front} in
let: "proph" := Proph in
let: "back" := "t".{back} in
if:
(let: "@tmp" := "t".{front} in
Resolve Skip "proph" "@tmp" ;;
"@tmp")
==
"front"
then (
int٠positive_part ("back" - "front")
) else (
"size" "t"
).
Definition inf_mpmc_queue_1٠is_empty : val :=
fun: "t" ⇒
inf_mpmc_queue_1٠size "t" == 0.
Definition inf_mpmc_queue_1٠is_empty_weak : val :=
fun: "t" ⇒
let: "front" := "t".{front} in
let: "back" := "t".{back} in
"back" ≤ "front".
Definition inf_mpmc_queue_1٠push : val :=
fun: "t" "v" ⇒
let: "i" := FAA "t".[back] 1 in
inf_array٠set "t".{data} "i" ‘Something( "v" ).
Definition inf_mpmc_queue_1٠pop₀ : val :=
rec: "pop" "t" "i" ⇒
match: inf_array٠get "t".{data} "i" with
| Nothing ⇒
domain٠yield () ;;
"pop" "t" "i"
| Anything ⇒
Fail
| Something "v" ⇒
inf_array٠set "t".{data} "i" §Anything ;;
"v"
end.
Definition inf_mpmc_queue_1٠pop : val :=
fun: "t" ⇒
let: "i" := FAA "t".[front] 1 in
inf_mpmc_queue_1٠pop₀ "t" "i".
Definition inf_mpmc_queue_1٠try_pop : val :=
fun: "t" ⇒
if: inf_mpmc_queue_1٠is_empty_weak "t" then (
§None
) else (
‘Some( inf_mpmc_queue_1٠pop "t" )
).
prelude.
From zoo.language Require Import
typeclasses
notations.
From zoo_std Require Import
inf_array
int
optional
domain.
From zoo_saturn Require Import
inf_mpmc_queue_1__types.
From zoo Require Import
options.
Definition inf_mpmc_queue_1٠create : val :=
fun: ≠ ⇒
{ inf_array٠create §Nothing, 0, 0 }.
Definition inf_mpmc_queue_1٠size : val :=
rec: "size" "t" ⇒
let: "front" := "t".{front} in
let: "proph" := Proph in
let: "back" := "t".{back} in
if:
(let: "@tmp" := "t".{front} in
Resolve Skip "proph" "@tmp" ;;
"@tmp")
==
"front"
then (
int٠positive_part ("back" - "front")
) else (
"size" "t"
).
Definition inf_mpmc_queue_1٠is_empty : val :=
fun: "t" ⇒
inf_mpmc_queue_1٠size "t" == 0.
Definition inf_mpmc_queue_1٠is_empty_weak : val :=
fun: "t" ⇒
let: "front" := "t".{front} in
let: "back" := "t".{back} in
"back" ≤ "front".
Definition inf_mpmc_queue_1٠push : val :=
fun: "t" "v" ⇒
let: "i" := FAA "t".[back] 1 in
inf_array٠set "t".{data} "i" ‘Something( "v" ).
Definition inf_mpmc_queue_1٠pop₀ : val :=
rec: "pop" "t" "i" ⇒
match: inf_array٠get "t".{data} "i" with
| Nothing ⇒
domain٠yield () ;;
"pop" "t" "i"
| Anything ⇒
Fail
| Something "v" ⇒
inf_array٠set "t".{data} "i" §Anything ;;
"v"
end.
Definition inf_mpmc_queue_1٠pop : val :=
fun: "t" ⇒
let: "i" := FAA "t".[front] 1 in
inf_mpmc_queue_1٠pop₀ "t" "i".
Definition inf_mpmc_queue_1٠try_pop : val :=
fun: "t" ⇒
if: inf_mpmc_queue_1٠is_empty_weak "t" then (
§None
) else (
‘Some( inf_mpmc_queue_1٠pop "t" )
).