Library zoo_parabs.waiters__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_parabs.waiter.
Require Import zoo_saturn.queue_mpmc_1.
Require Import zoo_std.array.
Require Import zoo.options.

Notation "'waitersู waiters'" := (
  in_type "zoo_parabs.waiters.t" 0
)(in custom zoo_proj
).
Notation "'waitersู queue'" := (
  in_type "zoo_parabs.waiters.t" 1
)(in custom zoo_proj
).

Definition waitersู create : val :=
  ๐—ณ๐˜‚๐—ป "sz" โ†’
    (arrayู unsafe_init "sz" waiterู create, queue_mpmc_1ู create ()).

Definition waitersู notify : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—น๐—ฒ๐˜ "waiter" =
      arrayู unsafe_get "t".<waitersู waiters> "i"
    ๐—ถ๐—ป
    waiterู notify "waiter" โฎ
    ().

Definition waitersู notify_one : val :=
  ๐—ฟ๐—ฒ๐—ฐ "notify_one" "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
      queue_mpmc_1ู pop "t".<waitersู queue>
    ๐˜„๐—ถ๐˜๐—ต
    | None โ†’
        ()
    | Some "waiter" โ†’
        ๐—ถ๐—ณ ยฌ waiterู notify "waiter" ๐˜๐—ต๐—ฒ๐—ป (
          "notify_one" "t"
        )
    ๐—ฒ๐—ป๐—ฑ.

Definition waitersู notify_all : val :=
  ๐—ฟ๐—ฒ๐—ฐ "notify_all" "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
      queue_mpmc_1ู pop "t".<waitersู queue>
    ๐˜„๐—ถ๐˜๐—ต
    | None โ†’
        ()
    | Some "waiter" โ†’
        waiterู notify "waiter" โฎ
        "notify_all" "t"
    ๐—ฒ๐—ป๐—ฑ.

Definition waitersู prepare_wait : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—น๐—ฒ๐˜ "waiter" =
      arrayู unsafe_get "t".<waitersู waiters> "i"
    ๐—ถ๐—ป
    waiterู prepare_wait "waiter" โฎ
    queue_mpmc_1ู push "t".<waitersู queue> "waiter".

Definition waitersู cancel_wait : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—น๐—ฒ๐˜ "waiter" =
      arrayู unsafe_get "t".<waitersู waiters> "i"
    ๐—ถ๐—ป
    waiterู cancel_wait "waiter".

Definition waitersู commit_wait : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    ๐—น๐—ฒ๐˜ "waiter" =
      arrayู unsafe_get "t".<waitersู waiters> "i"
    ๐—ถ๐—ป
    waiterู commit_wait "waiter".