Library zoo_persistent.sarray__code
Require Import zoo.prelude.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo.options.
Notation "'sarray٠Root'" := (
in_type "zoo_persistent.sarray.descr" 0
)(in custom zoo_tag
).
Notation "'sarray٠Diff'" := (
in_type "zoo_persistent.sarray.descr" 1
)(in custom zoo_tag
).
Notation "'sarray٠equal'" := (
in_type "zoo_persistent.sarray.t" 0
)(in custom zoo_field
).
Notation "'sarray٠data'" := (
in_type "zoo_persistent.sarray.t" 1
)(in custom zoo_field
).
Notation "'sarray٠root'" := (
in_type "zoo_persistent.sarray.t" 2
)(in custom zoo_field
).
Definition sarray٠make : val :=
𝗳𝘂𝗻 "equal" "sz" "v" →
𝗹𝗲𝘁 "data" = array٠unsafe_make "sz" "v" 𝗶𝗻
𝗹𝗲𝘁 "root" = 𝗿𝗲𝗳 §sarray٠Root 𝗶𝗻
{ "equal", "data", "root" }.
Definition sarray٠get : val :=
𝗳𝘂𝗻 "t" "i" →
array٠unsafe_get "t".{sarray٠data} "i".
Definition sarray٠set : val :=
𝗳𝘂𝗻 "t" "i" "v" →
𝗹𝗲𝘁 "v'" = array٠unsafe_get "t".{sarray٠data} "i" 𝗶𝗻
𝗶𝗳 ¬ "t".{sarray٠equal} "v" "v'" 𝘁𝗵𝗲𝗻 (
𝗹𝗲𝘁 "root" = 𝗿𝗲𝗳 §sarray٠Root 𝗶𝗻
"t".{sarray٠root} <- ‘sarray٠Diff( "i", "v'", "root" ) ⍮
"t" <-{sarray٠root} "root" ⍮
array٠unsafe_set "t".{sarray٠data} "i" "v"
).
Definition sarray٠capture : val :=
𝗳𝘂𝗻 "t" →
"t".{sarray٠root}.
Definition sarray٠restore₁ : val :=
𝗿𝗲𝗰 "restore" "data" "node" →
𝗺𝗮𝘁𝗰𝗵 !"node" 𝘄𝗶𝘁𝗵
| sarray٠Root →
()
| sarray٠Diff "i" "v" "node'" →
"restore" "data" "node'" ⍮
"node'" <-
‘sarray٠Diff( "i", array٠unsafe_get "data" "i", "node" ) ⍮
array٠unsafe_set "data" "i" "v"
𝗲𝗻𝗱.
Definition sarray٠restore : val :=
𝗳𝘂𝗻 "t" "s" →
𝗺𝗮𝘁𝗰𝗵 !"s" 𝘄𝗶𝘁𝗵
| sarray٠Root →
()
| sarray٠Diff ⎽ ⎽ ⎽ →
sarray٠restore₁ "t".{sarray٠data} "s" ⍮
"s" <- §sarray٠Root ⍮
"t" <-{sarray٠root} "s"
𝗲𝗻𝗱.
Require Import zoo.language.typeclasses.
Require Import zoo.language.notations.
Require Import zoo_std.array.
Require Import zoo.options.
Notation "'sarray٠Root'" := (
in_type "zoo_persistent.sarray.descr" 0
)(in custom zoo_tag
).
Notation "'sarray٠Diff'" := (
in_type "zoo_persistent.sarray.descr" 1
)(in custom zoo_tag
).
Notation "'sarray٠equal'" := (
in_type "zoo_persistent.sarray.t" 0
)(in custom zoo_field
).
Notation "'sarray٠data'" := (
in_type "zoo_persistent.sarray.t" 1
)(in custom zoo_field
).
Notation "'sarray٠root'" := (
in_type "zoo_persistent.sarray.t" 2
)(in custom zoo_field
).
Definition sarray٠make : val :=
𝗳𝘂𝗻 "equal" "sz" "v" →
𝗹𝗲𝘁 "data" = array٠unsafe_make "sz" "v" 𝗶𝗻
𝗹𝗲𝘁 "root" = 𝗿𝗲𝗳 §sarray٠Root 𝗶𝗻
{ "equal", "data", "root" }.
Definition sarray٠get : val :=
𝗳𝘂𝗻 "t" "i" →
array٠unsafe_get "t".{sarray٠data} "i".
Definition sarray٠set : val :=
𝗳𝘂𝗻 "t" "i" "v" →
𝗹𝗲𝘁 "v'" = array٠unsafe_get "t".{sarray٠data} "i" 𝗶𝗻
𝗶𝗳 ¬ "t".{sarray٠equal} "v" "v'" 𝘁𝗵𝗲𝗻 (
𝗹𝗲𝘁 "root" = 𝗿𝗲𝗳 §sarray٠Root 𝗶𝗻
"t".{sarray٠root} <- ‘sarray٠Diff( "i", "v'", "root" ) ⍮
"t" <-{sarray٠root} "root" ⍮
array٠unsafe_set "t".{sarray٠data} "i" "v"
).
Definition sarray٠capture : val :=
𝗳𝘂𝗻 "t" →
"t".{sarray٠root}.
Definition sarray٠restore₁ : val :=
𝗿𝗲𝗰 "restore" "data" "node" →
𝗺𝗮𝘁𝗰𝗵 !"node" 𝘄𝗶𝘁𝗵
| sarray٠Root →
()
| sarray٠Diff "i" "v" "node'" →
"restore" "data" "node'" ⍮
"node'" <-
‘sarray٠Diff( "i", array٠unsafe_get "data" "i", "node" ) ⍮
array٠unsafe_set "data" "i" "v"
𝗲𝗻𝗱.
Definition sarray٠restore : val :=
𝗳𝘂𝗻 "t" "s" →
𝗺𝗮𝘁𝗰𝗵 !"s" 𝘄𝗶𝘁𝗵
| sarray٠Root →
()
| sarray٠Diff ⎽ ⎽ ⎽ →
sarray٠restore₁ "t".{sarray٠data} "s" ⍮
"s" <- §sarray٠Root ⍮
"t" <-{sarray٠root} "s"
𝗲𝗻𝗱.