Library zoo_saturn.bag_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.domain.
Require Import zoo_std.goption.
Require Import zoo.options.

Notation "'bag_1ู data'" := (
  in_type "zoo_saturn.bag_1.t" 0
)(in custom zoo_field
).
Notation "'bag_1ู front'" := (
  in_type "zoo_saturn.bag_1.t" 1
)(in custom zoo_field
).
Notation "'bag_1ู back'" := (
  in_type "zoo_saturn.bag_1.t" 2
)(in custom zoo_field
).

Definition bag_1ู create : val :=
  ๐—ณ๐˜‚๐—ป "sz" โ†’
    { arrayู unsafe_init
        "sz"
        (๐—ณ๐˜‚๐—ป โŽฝ โ†’ ๐—ฟ๐—ฒ๐—ณ ยงgoptionู None),
      0,
      0
    }.

Definition bag_1ู pushโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "push" "slot" "o" โ†’
    ๐—ถ๐—ณ
      ยฌ ๐—ฐ๐—ฎ๐˜€ "slot".[contents] ยงgoptionู None "o"
    ๐˜๐—ต๐—ฒ๐—ป (
      domainู yield () โฎ
      "push" "slot" "o"
    ).

Definition bag_1ู push : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    ๐—น๐—ฒ๐˜ "data" = "t".{bag_1ู data} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "i" =
      ๐—ณ๐—ฎ๐—ฎ "t".[bag_1ู back] 1 ๐—ฟ๐—ฒ๐—บ arrayู size "data"
    ๐—ถ๐—ป
    bag_1ู pushโ‚ (arrayู unsafe_get "data" "i") โ€˜goptionู Some[ "v" ].

Definition bag_1ู popโ‚ : val :=
  ๐—ฟ๐—ฒ๐—ฐ "pop" "slot" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต !"slot" ๐˜„๐—ถ๐˜๐—ต
    | goptionู None โ†’
        "pop" "slot"
    | goptionู Some "v" ๐—ฎ๐˜€ "o" โ†’
        ๐—ถ๐—ณ
          ๐—ฐ๐—ฎ๐˜€ "slot".[contents] "o" ยงgoptionู None
        ๐˜๐—ต๐—ฒ๐—ป (
          "v"
        ) ๐—ฒ๐—น๐˜€๐—ฒ (
          domainู yield () โฎ
          "pop" "slot"
        )
    ๐—ฒ๐—ป๐—ฑ.

Definition bag_1ู pop : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—น๐—ฒ๐˜ "data" = "t".{bag_1ู data} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "i" =
      ๐—ณ๐—ฎ๐—ฎ "t".[bag_1ู front] 1 ๐—ฟ๐—ฒ๐—บ arrayู size "data"
    ๐—ถ๐—ป
    bag_1ู popโ‚ (arrayู unsafe_get "data" "i").