Library zoo_saturn.queue_mpsc_3__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.clist.
Require Import zoo_std.domain.
Require Import zoo.options.

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

Definition queue_mpsc_3ู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    { ยงclistู Open, ยงclistู Open }.

Definition queue_mpsc_3ู is_empty : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{queue_mpsc_3ู front} ๐˜„๐—ถ๐˜๐—ต
    | clistู Closed โ†’
        true
    | clistู Cons โŽฝ โŽฝ โ†’
        false
    | clistู Open โ†’
        ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{queue_mpsc_3ู back} ๐˜„๐—ถ๐˜๐—ต
        | clistู Cons โŽฝ โŽฝ โ†’
            false
        | โŽฝ โ†’
            true
        ๐—ฒ๐—ป๐—ฑ
    ๐—ฒ๐—ป๐—ฑ.

Definition queue_mpsc_3ู push_front : val :=
  ๐—ณ๐˜‚๐—ป "t" "v" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{queue_mpsc_3ู front} ๐˜„๐—ถ๐˜๐—ต
    | clistู Closed โ†’
        true
    | โŽฝ ๐—ฎ๐˜€ "front" โ†’
        "t" <-{queue_mpsc_3ู front} โ€˜clistู Cons[ "v", "front" ] โฎ
        false
    ๐—ฒ๐—ป๐—ฑ.

Definition queue_mpsc_3ู push_back : val :=
  ๐—ฟ๐—ฒ๐—ฐ "push_back" "t" "v" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{queue_mpsc_3ู back} ๐˜„๐—ถ๐˜๐—ต
    | clistู Closed โ†’
        true
    | โŽฝ ๐—ฎ๐˜€ "back" โ†’
        ๐—ถ๐—ณ
          ๐—ฐ๐—ฎ๐˜€
            "t".[queue_mpsc_3ู back]
            "back"
            โ€˜clistู Cons[ "v", "back" ]
        ๐˜๐—ต๐—ฒ๐—ป (
          false
        ) ๐—ฒ๐—น๐˜€๐—ฒ (
          domainู yield () โฎ
          "push_back" "t" "v"
        )
    ๐—ฒ๐—ป๐—ฑ.

Definition queue_mpsc_3ู pop : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต "t".{queue_mpsc_3ู front} ๐˜„๐—ถ๐˜๐—ต
    | clistู Closed โ†’
        ยงNone
    | clistู Cons "v" "front" โ†’
        "t" <-{queue_mpsc_3ู front} "front" โฎ
        โ€˜Some( "v" )
    | clistู Open โ†’
        ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
          ๐˜…๐—ฐ๐—ต๐—ด "t".[queue_mpsc_3ู back] ยงclistู Open
        ๐˜„๐—ถ๐˜๐—ต
        | clistู Open โ†’
            ยงNone
        | โŽฝ ๐—ฎ๐˜€ "back" โ†’
            ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
              clistู rev_app "back" ยงclistู Open
            ๐˜„๐—ถ๐˜๐—ต
            | clistู Cons "v" "front" โ†’
                "t" <-{queue_mpsc_3ู front} "front" โฎ
                โ€˜Some( "v" )
            | โŽฝ โ†’
                ๐—ณ๐—ฎ๐—ถ๐—น
            ๐—ฒ๐—ป๐—ฑ
        ๐—ฒ๐—ป๐—ฑ
    ๐—ฒ๐—ป๐—ฑ.

Definition queue_mpsc_3ู close : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—บ๐—ฎ๐˜๐—ฐ๐—ต
      ๐˜…๐—ฐ๐—ต๐—ด "t".[queue_mpsc_3ู back] ยงclistู Closed
    ๐˜„๐—ถ๐˜๐—ต
    | clistู Closed โ†’
        true
    | โŽฝ ๐—ฎ๐˜€ "back" โ†’
        "t" <-{queue_mpsc_3ู front}
          clistู app
            "t".{queue_mpsc_3ู front}
            (clistู rev_app "back" ยงclistู Closed) โฎ
        false
    ๐—ฒ๐—ป๐—ฑ.