Library zoo_std.dynarray_1__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.options.

Notation "'dynarray_1ู size'" := (
  in_type "zoo_std.dynarray_1.t" 0
)(in custom zoo_field
).
Notation "'dynarray_1ู data'" := (
  in_type "zoo_std.dynarray_1.t" 1
)(in custom zoo_field
).

Definition dynarray_1ู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    { 0, arrayู create () }.

Definition dynarray_1ู make : val :=
  ๐—ณ๐˜‚๐—ป "sz" "v" โ†’
    { "sz", arrayู unsafe_make "sz" "v" }.

Definition dynarray_1ู initi : val :=
  ๐—ณ๐˜‚๐—ป "sz" "fn" โ†’
    { "sz", arrayู unsafe_initi "sz" "fn" }.

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

Definition dynarray_1ู capacity : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    arrayู size "t".{dynarray_1ู data}.

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

Definition dynarray_1ู get : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" โ†’
    arrayู unsafe_get "t".{dynarray_1ู data} "i".

Definition dynarray_1ู set : val :=
  ๐—ณ๐˜‚๐—ป "t" "i" "v" โ†’
    arrayู unsafe_set "t".{dynarray_1ู data} "i" "v".

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

Definition dynarray_1ู reserve : val :=
  ๐—ณ๐˜‚๐—ป "t" "n" โ†’
    ๐—น๐—ฒ๐˜ "data" = "t".{dynarray_1ู data} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "cap" = arrayู size "data" ๐—ถ๐—ป
    ๐—ถ๐—ณ "cap" < "n" ๐˜๐—ต๐—ฒ๐—ป (
      ๐—น๐—ฒ๐˜ "new_cap" =
        intู max "n" (dynarray_1ู next_capacity "cap")
      ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "new_data" = arrayู unsafe_alloc "new_cap" ๐—ถ๐—ป
      arrayู unsafe_copy_slice "data" 0 "new_data" 0 "t".{dynarray_1ู size} โฎ
      "t" <-{dynarray_1ู data} "new_data"
    ).

Definition dynarray_1ู reserve_extra : val :=
  ๐—ณ๐˜‚๐—ป "t" "n" โ†’
    dynarray_1ู reserve "t" ("t".{dynarray_1ู size} + "n").

Definition dynarray_1ู grow : val :=
  ๐—ณ๐˜‚๐—ป "t" "sz" "v" โ†’
    ๐—น๐—ฒ๐˜ "old_sz" = "t".{dynarray_1ู size} ๐—ถ๐—ป
    ๐—ถ๐—ณ "old_sz" < "sz" ๐˜๐—ต๐—ฒ๐—ป (
      dynarray_1ู reserve "t" "sz" โฎ
      arrayู unsafe_fill_slice
        "t".{dynarray_1ู data}
        "old_sz"
        ("sz" - "old_sz")
        "v" โฎ
      "t" <-{dynarray_1ู size} "sz"
    ).

Definition dynarray_1ู push : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    dynarray_1ู reserve_extra "t" 1 โฎ
    ๐—น๐—ฒ๐˜ "sz" = "t".{dynarray_1ู size} ๐—ถ๐—ป
    "t" <-{dynarray_1ู size} "sz" + 1 โฎ
    arrayู unsafe_set "t".{dynarray_1ู data} "sz" "v".

Definition dynarray_1ู pop : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—น๐—ฒ๐˜ "sz" = "t".{dynarray_1ู size} - 1 ๐—ถ๐—ป
    "t" <-{dynarray_1ู size} "sz" โฎ
    ๐—น๐—ฒ๐˜ "data" = "t".{dynarray_1ู data} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "v" = arrayู unsafe_get "data" "sz" ๐—ถ๐—ป
    arrayู unsafe_set "data" "sz" () โฎ
    "v".

Definition dynarray_1ู fit_capacity : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—น๐—ฒ๐˜ "sz" = "t".{dynarray_1ู size} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "data" = "t".{dynarray_1ู data} ๐—ถ๐—ป
    ๐—ถ๐—ณ "sz" != arrayู size "data" ๐˜๐—ต๐—ฒ๐—ป (
      "t" <-{dynarray_1ู data} arrayู unsafe_shrink "data" "sz"
    ).

Definition dynarray_1ู reset : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    "t" <-{dynarray_1ู size} 0 โฎ
    "t" <-{dynarray_1ู data} arrayู create ().

Definition dynarray_1ู iteri : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" โ†’
    arrayู unsafe_iteri_slice
      "fn"
      "t".{dynarray_1ู data}
      0
      "t".{dynarray_1ู size}.

Definition dynarray_1ู iter : val :=
  ๐—ณ๐˜‚๐—ป "fn" โ†’
    dynarray_1ู iteri (๐—ณ๐˜‚๐—ป "_i" โ†’ "fn").