Library zoo_std.ivar_2__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 "'ivar_2ู mutex'" := (
  in_type "zoo_std.ivar_2.t" 0
)(in custom zoo_field
).
Notation "'ivar_2ู condition'" := (
  in_type "zoo_std.ivar_2.t" 1
)(in custom zoo_field
).
Notation "'ivar_2ู result'" := (
  in_type "zoo_std.ivar_2.t" 2
)(in custom zoo_field
).

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

Definition ivar_2ู make : val :=
  ๐—ณ๐˜‚๐—ป "v" โ†’
    { mutexู create (), conditionู create (), โ€˜Some( "v" ) }.

Definition ivar_2ู try_get : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    "t".{ivar_2ู result}.

Definition ivar_2ู is_unset : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ivar_2ู try_get "t" == ยงNone.

Definition ivar_2ู is_set : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ยฌ ivar_2ู is_unset "t".

Definition ivar_2ู get : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต ivar_2ู try_get "t" ๐˜„๐—ถ๐˜๐—ต
    | Some "v" โ†’
        mutexู synchronize "t".{ivar_2ู mutex} โฎ
        "v"
    | None โ†’
        ๐—น๐—ฒ๐˜ "mtx" = "t".{ivar_2ู mutex} ๐—ถ๐—ป
        ๐—น๐—ฒ๐˜ "cond" = "t".{ivar_2ู condition} ๐—ถ๐—ป
        mutexู protect
          "mtx"
          (๐—ณ๐˜‚๐—ป โŽฝ โ†’
             conditionู wait_while
               "cond"
               "mtx"
               (๐—ณ๐˜‚๐—ป โŽฝ โ†’ "t".{ivar_2ู result} == ยงNone)) โฎ
        ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{ivar_2ู result} ๐˜„๐—ถ๐˜๐—ต
        | Some "v" โ†’
            "v"
        | None โ†’
            ๐—ณ๐—ฎ๐—ถ๐—น
        ๐—ฒ๐—ป๐—ฑ
    ๐—ฒ๐—ป๐—ฑ.

Definition ivar_2ู set : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    mutexู protect
      "t".{ivar_2ู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’ "t" <-{ivar_2ู result} โ€˜Some( "v" )) โฎ
    conditionู notify_all "t".{ivar_2ู condition}.