Library zoo_persistent.pstore_2__code
From zoo Require Import
prelude.
From zoo.language Require Import
typeclasses
notations.
From zoo_std Require Import
assert.
From zoo_persistent Require Import
pstore_2__types.
From zoo Require Import
options.
Definition pstore_2٠create : val :=
fun: ≠ ⇒
{ 0, ref §Root }.
Definition pstore_2٠ref : val :=
fun: "_t" "v" ⇒
{ 0, "v" }.
Definition pstore_2٠get : val :=
fun: "_t" "r" ⇒
"r".{ref_value}.
Definition pstore_2٠set : val :=
fun: "t" "r" "v" ⇒
let: "g_t" := "t".{gen} in
let: "g_r" := "r".{ref_gen} in
if: "g_t" == "g_r" then (
"r" <-{ref_value} "v"
) else (
let: "root" := ref §Root in
"t".{root} <- ‘Diff( "r", "g_r", "r".{ref_value}, "root" ) ;;
"r" <-{ref_gen} "g_t" ;;
"r" <-{ref_value} "v" ;;
"t" <-{root} "root"
).
Definition pstore_2٠capture : val :=
fun: "t" ⇒
let: "g" := "t".{gen} in
"t" <-{gen} "g" + 1 ;;
("t", "g", "t".{root}).
Definition pstore_2٠collect : val :=
rec: "collect" "node" "path" ⇒
match: !"node" with
| Root ⇒
("node", "path")
| Diff ≠ ≠ ≠ "node'" ⇒
"collect" "node'" ("node" :: "path")
end.
Definition pstore_2٠revert : val :=
rec: "revert" "node" "param" ⇒
match: "param" with
| [] ⇒
"node" <- §Root
| "node'" :: "path" ⇒
match: !"node'" with
| Root ⇒
Fail
| Diff "r" "g" "v" "node_" ⇒
assert ("node_" == "node") ;;
"node" <- ‘Diff( "r", "r".{ref_gen}, "r".{ref_value}, "node'" ) ;;
"r" <-{ref_gen} "g" ;;
"r" <-{ref_value} "v" ;;
"revert" "node'" "path"
end
end.
Definition pstore_2٠reroot : val :=
fun: "node" ⇒
let: "root", "path" := pstore_2٠collect "node" [] in
pstore_2٠revert "root" "path".
Definition pstore_2٠restore : val :=
fun: "t" "s" ⇒
if: "t" != "s".<snapshot_store> then (
Fail
) else (
let: "root" := "s".<snapshot_root> in
match: !"root" with
| Root ⇒
()
| Diff ≠ ≠ ≠ ≠ ⇒
pstore_2٠reroot "root" ;;
"t" <-{gen} "s".<snapshot_gen> + 1 ;;
"t" <-{root} "root"
end
).
prelude.
From zoo.language Require Import
typeclasses
notations.
From zoo_std Require Import
assert.
From zoo_persistent Require Import
pstore_2__types.
From zoo Require Import
options.
Definition pstore_2٠create : val :=
fun: ≠ ⇒
{ 0, ref §Root }.
Definition pstore_2٠ref : val :=
fun: "_t" "v" ⇒
{ 0, "v" }.
Definition pstore_2٠get : val :=
fun: "_t" "r" ⇒
"r".{ref_value}.
Definition pstore_2٠set : val :=
fun: "t" "r" "v" ⇒
let: "g_t" := "t".{gen} in
let: "g_r" := "r".{ref_gen} in
if: "g_t" == "g_r" then (
"r" <-{ref_value} "v"
) else (
let: "root" := ref §Root in
"t".{root} <- ‘Diff( "r", "g_r", "r".{ref_value}, "root" ) ;;
"r" <-{ref_gen} "g_t" ;;
"r" <-{ref_value} "v" ;;
"t" <-{root} "root"
).
Definition pstore_2٠capture : val :=
fun: "t" ⇒
let: "g" := "t".{gen} in
"t" <-{gen} "g" + 1 ;;
("t", "g", "t".{root}).
Definition pstore_2٠collect : val :=
rec: "collect" "node" "path" ⇒
match: !"node" with
| Root ⇒
("node", "path")
| Diff ≠ ≠ ≠ "node'" ⇒
"collect" "node'" ("node" :: "path")
end.
Definition pstore_2٠revert : val :=
rec: "revert" "node" "param" ⇒
match: "param" with
| [] ⇒
"node" <- §Root
| "node'" :: "path" ⇒
match: !"node'" with
| Root ⇒
Fail
| Diff "r" "g" "v" "node_" ⇒
assert ("node_" == "node") ;;
"node" <- ‘Diff( "r", "r".{ref_gen}, "r".{ref_value}, "node'" ) ;;
"r" <-{ref_gen} "g" ;;
"r" <-{ref_value} "v" ;;
"revert" "node'" "path"
end
end.
Definition pstore_2٠reroot : val :=
fun: "node" ⇒
let: "root", "path" := pstore_2٠collect "node" [] in
pstore_2٠revert "root" "path".
Definition pstore_2٠restore : val :=
fun: "t" "s" ⇒
if: "t" != "s".<snapshot_store> then (
Fail
) else (
let: "root" := "s".<snapshot_root> in
match: !"root" with
| Root ⇒
()
| Diff ≠ ≠ ≠ ≠ ⇒
pstore_2٠reroot "root" ;;
"t" <-{gen} "s".<snapshot_gen> + 1 ;;
"t" <-{root} "root"
end
).