Library zoo_std.xdeque__code

Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo.options.

Notation "'xdequeู prev'" := (
  in_type "zoo_std.xdeque.node" 0
)(in custom zoo_field
).
Notation "'xdequeู next'" := (
  in_type "zoo_std.xdeque.node" 1
)(in custom zoo_field
).
Notation "'xdequeู data'" := (
  in_type "zoo_std.xdeque.node" 2
)(in custom zoo_field
).

Definition xdequeู create : val :=
  ๐—ณ๐˜‚๐—ป โŽฝ โ†’
    ๐—น๐—ฒ๐˜ "t" = { (), (), () } ๐—ถ๐—ป
    "t" <-{xdequeู prev} "t" โฎ
    "t" <-{xdequeู next} "t" โฎ
    "t".

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

Definition xdequeู link : val :=
  ๐—ณ๐˜‚๐—ป "node1" "node2" โ†’
    "node1" <-{xdequeู next} "node2" โฎ
    "node2" <-{xdequeู prev} "node1".

Definition xdequeู insert : val :=
  ๐—ณ๐˜‚๐—ป "prev" "node" "next" โ†’
    xdequeู link "prev" "node" โฎ
    xdequeู link "node" "next".

Definition xdequeู push_front : val :=
  ๐—ณ๐˜‚๐—ป "t" "front" โ†’
    xdequeู insert "t" "front" "t".{xdequeู next}.

Definition xdequeู push_back : val :=
  ๐—ณ๐˜‚๐—ป "t" "back" โ†’
    xdequeู insert "t".{xdequeู prev} "back" "t".

Definition xdequeู pop_front : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—ถ๐—ณ xdequeู is_empty "t" ๐˜๐—ต๐—ฒ๐—ป (
      ยงNone
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "old_front" = "t".{xdequeู next} ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "front" = "old_front".{xdequeู next} ๐—ถ๐—ป
      xdequeู link "t" "front" โฎ
      โ€˜Some( "old_front" )
    ).

Definition xdequeู pop_back : val :=
  ๐—ณ๐˜‚๐—ป "t" โ†’
    ๐—ถ๐—ณ xdequeู is_empty "t" ๐˜๐—ต๐—ฒ๐—ป (
      ยงNone
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      ๐—น๐—ฒ๐˜ "old_back" = "t".{xdequeู prev} ๐—ถ๐—ป
      ๐—น๐—ฒ๐˜ "back" = "old_back".{xdequeู prev} ๐—ถ๐—ป
      xdequeู link "back" "t" โฎ
      โ€˜Some( "old_back" )
    ).

Definition xdequeู remove : val :=
  ๐—ณ๐˜‚๐—ป "node" โ†’
    ๐—น๐—ฒ๐˜ "prev" = "node".{xdequeู prev} ๐—ถ๐—ป
    ๐—น๐—ฒ๐˜ "next" = "node".{xdequeู next} ๐—ถ๐—ป
    xdequeู link "prev" "next".

Definition xdequeู iter_aux : val :=
  ๐—ฟ๐—ฒ๐—ฐ "iter_aux" "fn" "t" "node" โ†’
    ๐—ถ๐—ณ "node" == "t" ๐˜๐—ต๐—ฒ๐—ป (
      ()
    ) ๐—ฒ๐—น๐˜€๐—ฒ (
      "fn" "node" โฎ
      "iter_aux" "fn" "t" "node".{xdequeู next}
    ).

Definition xdequeู iter : val :=
  ๐—ณ๐˜‚๐—ป "fn" "t" โ†’
    xdequeู iter_aux "fn" "t" "t".{xdequeู next}.