Library zoo_std.inf_array__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo_std.int.
Require Import zoo_std.mutex.
Require Import zoo.options.

Notation "'inf_arrayู data'" := (
  in_type "zoo_std.inf_array.t" 0
)(in custom zoo_field
).
Notation "'inf_arrayู default'" := (
  in_type "zoo_std.inf_array.t" 1
)(in custom zoo_field
).
Notation "'inf_arrayู mutex'" := (
  in_type "zoo_std.inf_array.t" 2
)(in custom zoo_field
).

Definition inf_arrayู create : val :=
  ๐—ณ๐˜‚๐—ป "default" โ†’
    ๐—น๐—ฒ๐˜ "data" = arrayู create () ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "mutex" = mutexู create () ๐—ถ๐—ป
    { "data", "default", "mutex" }.

Definition inf_arrayู next_capacity : val :=
  ๐—ณ๐˜‚๐—ป "n" โ†’
    intู max
      8
      ๐—ถ๐—ณ "n" โ‰ค 512 ๐˜๐—ต๐—ฒ๐—ป (
        2 ร— "n"
      ) ๐—ฒ๐—น๐˜€๐—ฒ (
        "n" + "n" ๐—พ๐˜‚๐—ผ๐˜ 2
      ).

Definition inf_arrayู reserve : val :=
  ๐—ณ๐˜‚๐—ป "t" "n" โ†’
    ๐—น๐—ฒ๐˜ "data" = "t".{inf_arrayู data} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "cap" = arrayู size "data" ๐—ถ๐—ป
    ๐—ถ๐—ณ "cap" < "n" ๐˜๐—ต๐—ฒ๐—ป (
      ๐—น๐—ฒ๐˜ "cap" =
        intู max "n" (inf_arrayู next_capacity "cap")
      ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "data" =
        arrayู unsafe_grow "data" "cap" "t".{inf_arrayู default}
      ๐—ถ๐—ป
      "t" <-{inf_arrayู data} "data"
    ).

Definition inf_arrayู get : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    mutexู protect "t".{inf_arrayู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’
         ๐—น๐—ฒ๐˜ "data" = "t".{inf_arrayู data} ๐—ถ๐—ป
         ๐—ถ๐—ณ "i" < arrayู size "data" ๐˜๐—ต๐—ฒ๐—ป (
           arrayู unsafe_get "data" "i"
         ) ๐—ฒ๐—น๐˜€๐—ฒ (
           "t".{inf_arrayู default}
         )).

Definition inf_arrayู update : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "fn" โ†’
    mutexู protect "t".{inf_arrayู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’
         inf_arrayู reserve "t" ("i" + 1) โฎ
         ๐—น๐—ฒ๐˜ "v" =
           arrayู unsafe_get "t".{inf_arrayู data} "i"
         ๐—ถ๐—ป
         arrayู unsafe_set "t".{inf_arrayู data} "i" ("fn" "v") โฎ
         "v").

Definition inf_arrayู xchg : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    inf_arrayู update "t" "i" (๐—ณ๐˜‚๐—ป โŽฝ โ†’ "v").

Definition inf_arrayู xchg_resolve : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" "proph" "v_resolve" โ†’
    mutexู protect "t".{inf_arrayู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’
         inf_arrayู reserve "t" ("i" + 1) โฎ
         ๐—น๐—ฒ๐˜ "old_v" =
           arrayู unsafe_get "t".{inf_arrayู data} "i"
         ๐—ถ๐—ป
         arrayู unsafe_set "t".{inf_arrayู data} "i" "v" โฎ
         ๐—ฟ๐—ฒ๐˜€๐—ผ๐—น๐˜ƒ๐—ฒ ๐˜€๐—ธ๐—ถ๐—ฝ "proph" "v_resolve" โฎ
         "old_v").

Definition inf_arrayู set : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    inf_arrayู xchg "t" "i" "v" โฎ
    ().

Definition inf_arrayู cas : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v1" "v2" โ†’
    mutexู protect "t".{inf_arrayู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’
         inf_arrayู reserve "t" ("i" + 1) โฎ
         ๐—น๐—ฒ๐˜ "res" =
           arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
         ๐—ถ๐—ป
         ๐—ถ๐—ณ "res" ๐˜๐—ต๐—ฒ๐—ป (
           arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
         ) ๐—ฒ๐—น๐˜€๐—ฒ (
           ()
         ) โฎ
         "res").

Definition inf_arrayู cas_resolve : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v1" "v2" "proph" "v_resolve" โ†’
    mutexู protect "t".{inf_arrayู mutex}
      (๐—ณ๐˜‚๐—ป โŽฝ โ†’
         inf_arrayู reserve "t" ("i" + 1) โฎ
         ๐—น๐—ฒ๐˜ "res" =
           arrayู unsafe_get "t".{inf_arrayู data} "i" == "v1"
         ๐—ถ๐—ป
         ๐—ถ๐—ณ "res" ๐˜๐—ต๐—ฒ๐—ป (
           arrayู unsafe_set "t".{inf_arrayู data} "i" "v2"
         ) ๐—ฒ๐—น๐˜€๐—ฒ (
           ()
         ) โฎ
         ๐—ฟ๐—ฒ๐˜€๐—ผ๐—น๐˜ƒ๐—ฒ ๐˜€๐—ธ๐—ถ๐—ฝ "proph" "v_resolve" โฎ
         "res").

Definition inf_arrayู faa : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "incr" โ†’
    inf_arrayู update "t" "i" (๐—ณ๐˜‚๐—ป "n" โ†’ "n" + "incr").