Library zoo_saturn.inf_queue_mpmc_1__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.domain.
Require Import zoo_std.inf_array.
Require Import zoo_std.int.
Require Import zoo_std.optional.
Require Import zoo.options.

Notation "'inf_queue_mpmc_1ู data'" := (
  in_type "zoo_saturn.inf_queue_mpmc_1.t" 0
)(in custom zoo_field
).
Notation "'inf_queue_mpmc_1ู front'" := (
  in_type "zoo_saturn.inf_queue_mpmc_1.t" 1
)(in custom zoo_field
).
Notation "'inf_queue_mpmc_1ู back'" := (
  in_type "zoo_saturn.inf_queue_mpmc_1.t" 2
)(in custom zoo_field
).

Definition inf_queue_mpmc_1ู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    { inf_arrayู create ยงoptionalู Nothing, 0, 0 }.

Definition inf_queue_mpmc_1ู size : val :=
  ๐—ฟ๐—ฒ๐—ฐ "size" "t" โ†’
    ๐—น๐—ฒ๐˜ "front" = "t".{inf_queue_mpmc_1ู front} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "proph" = ๐—ฝ๐—ฟ๐—ผ๐—ฝ๐—ต ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "back" = "t".{inf_queue_mpmc_1ู back} ๐—ถ๐—ป
    ๐—ถ๐—ณ
      (๐—น๐—ฒ๐˜ "@tmp" = "t".{inf_queue_mpmc_1ู front} ๐—ถ๐—ป
       ๐—ฟ๐—ฒ๐˜€๐—ผ๐—น๐˜ƒ๐—ฒ ๐˜€๐—ธ๐—ถ๐—ฝ "proph" "@tmp" โฎ
       "@tmp")
      ==
      "front"
    ๐˜๐—ต๐—ฒ๐—ป (
      intู positive_part ("back" - "front")
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      "size" "t"
    ).

Definition inf_queue_mpmc_1ู is_empty : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    inf_queue_mpmc_1ู size "t" == 0.

Definition inf_queue_mpmc_1ู is_empty_weak : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—น๐—ฒ๐˜ "front" = "t".{inf_queue_mpmc_1ู front} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "back" = "t".{inf_queue_mpmc_1ู back} ๐—ถ๐—ป
    "back" โ‰ค "front".

Definition inf_queue_mpmc_1ู push : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    ๐—น๐—ฒ๐˜ "i" = ๐—ณ๐—ฎ๐—ฎ "t".[inf_queue_mpmc_1ู back] 1 ๐—ถ๐—ป
    inf_arrayู set
      "t".{inf_queue_mpmc_1ู data}
      "i"
      โ€˜optionalู Something( "v" ).

Definition inf_queue_mpmc_1ู popโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "pop" "t" "i" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
      inf_arrayู get "t".{inf_queue_mpmc_1ู data} "i"
    ๐˜„๐—ถ๐˜๐—ต
    | optionalู Nothing โ†’
        domainู yield () โฎ
        "pop" "t" "i"
    | optionalู Anything โ†’
        ๐—ณ๐—ฎ๐—ถ๐—น
    | optionalู Something "v" โ†’
        inf_arrayู set "t".{inf_queue_mpmc_1ู data} "i" ยงoptionalู Anything โฎ
        "v"
    ๐—ฒ๐—ป๐—ฑ.

Definition inf_queue_mpmc_1ู pop : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—น๐—ฒ๐˜ "i" = ๐—ณ๐—ฎ๐—ฎ "t".[inf_queue_mpmc_1ู front] 1 ๐—ถ๐—ป
    inf_queue_mpmc_1ู popโ‚ "t" "i".

Definition inf_queue_mpmc_1ู try_pop : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—ถ๐—ณ inf_queue_mpmc_1ู is_empty_weak "t" ๐˜๐—ต๐—ฒ๐—ป (
      ยงNone
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      โ€˜Some( inf_queue_mpmc_1ู pop "t" )
    ).