Library zoo_std.waiter_mpsc__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.condition.
Require Import zoo_std.mutex.
Require Import zoo.options.

Notation "'waiter_mpscู mutex'" := (
  in_type "zoo_std.waiter_mpsc.t" 0
)(in custom zoo_field
).
Notation "'waiter_mpscู condition'" := (
  in_type "zoo_std.waiter_mpsc.t" 1
)(in custom zoo_field
).
Notation "'waiter_mpscู flag'" := (
  in_type "zoo_std.waiter_mpsc.t" 2
)(in custom zoo_field
).

Definition waiter_mpscู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    { mutexู create (), conditionู create (), false }.

Definition waiter_mpscู notify : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—ถ๐—ณ "t".{waiter_mpscู flag} ๐˜๐—ต๐—ฒ๐—ป (
      true
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "res" =
        mutexู protect "t".{waiter_mpscู mutex}
          (๐—ณ๐˜‚๐—ป โŽฝ โ†’
             ๐—ถ๐—ณ "t".{waiter_mpscู flag} ๐˜๐—ต๐—ฒ๐—ป (
               true
             ) ๐—ฒ๐—น๐˜€๐—ฒ (
               "t" <-{waiter_mpscู flag} true โฎ
               false
             ))
      ๐—ถ๐—ป
      conditionู notify "t".{waiter_mpscู condition} โฎ
      "res"
    ).

Definition waiter_mpscู try_wait : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    "t".{waiter_mpscู flag}.

Definition waiter_mpscู wait : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—ถ๐—ณ ยฌ waiter_mpscู try_wait "t" ๐˜๐—ต๐—ฒ๐—ป (
      ๐—น๐—ฒ๐˜ "mtx" = "t".{waiter_mpscู mutex} ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "cond" = "t".{waiter_mpscู condition} ๐—ถ๐—ป
      mutexู protect "mtx"
        (๐—ณ๐˜‚๐—ป โŽฝ โ†’
           conditionู wait_until
             "cond"
             "mtx"
             (๐—ณ๐˜‚๐—ป โŽฝ โ†’ "t".{waiter_mpscู flag}))
    ).