aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/Prototype.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/Prototype.ml')
-rw-r--r--lib/kernel/Prototype.ml34
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/kernel/Prototype.ml b/lib/kernel/Prototype.ml
index 9c1dcd2..8c12b40 100644
--- a/lib/kernel/Prototype.ml
+++ b/lib/kernel/Prototype.ml
@@ -6,6 +6,34 @@ let mixture ps = Protocols.Handle.make @@
method protocols = ps
end
+let rec mixture_of value f =
+ mixture (f (fun value' -> mixture_of value' f) value)
+
+module Associative = struct
+ module OfTree (S : Abstract.Storage.STORAGE) (K : Merkle.KEY with type t = string) = struct
+ module Tree = Merkle.Make (S) (K)
+ module SI = Storage.Make (S)
+
+ let make ~storage ~constructor ~node =
+ Protocols.Associative.make @@
+ object
+ method update key value =
+ (* TODO: read-only transactions *)
+ SI.with_transaction storage (fun tx ->
+ let open Utilities.Result in
+ let open Protocols in
+ let* node' = match value with
+ | None -> Tree.remove tx key node
+ | Some h ->
+ let* addressable = Handle.require Addressable.from h in
+ let addr = Addressable.address addressable in
+ Tree.insert tx key addr node
+ in
+ constructor node')
+ end
+ end
+end
+
module Directory = struct
let of_properties (props) =
Protocols.Directory.make @@
@@ -17,14 +45,14 @@ module Directory = struct
end
module OfTree (S : Abstract.Storage.STORAGE) (K : Merkle.KEY with type t = string) (V : Merkle.VALUE) = struct
- module Interface = Merkle.Interface (S) (K) (V)
+ module Tree = Merkle.Interface (S) (K) (V)
module SI = Storage.Make (S)
let make ~storage ~constructor ~node =
Protocols.Directory.make @@
object
- method list = SI.with_transaction storage (Fun.flip Interface.keys node)
- method find k = SI.with_transaction storage (fun tx -> Interface.lookup tx k node)
+ method list = SI.with_transaction storage (Fun.flip Tree.keys node)
+ method find k = SI.with_transaction storage (fun tx -> Tree.lookup tx k node)
|> Utilities.Result.fmap (function
| None -> Ok None
| Some x -> constructor x |> Result.map (Option.some))