aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/Merkle.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/Merkle.ml')
-rw-r--r--lib/kernel/Merkle.ml39
1 files changed, 25 insertions, 14 deletions
diff --git a/lib/kernel/Merkle.ml b/lib/kernel/Merkle.ml
index af703d7..ababb03 100644
--- a/lib/kernel/Merkle.ml
+++ b/lib/kernel/Merkle.ml
@@ -1,8 +1,8 @@
module type VALUE = sig
type t
- val encode : t -> Concepts.Representation.blob
- val decode : Concepts.Representation.blob -> (t, Concepts.Condition.condition) result
+ val encode : t -> Concepts.Blob.t
+ val decode : Concepts.Blob.t -> (t, Concepts.Condition.condition) result
end
module type KEY = sig
@@ -19,6 +19,7 @@ module type TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> sig
val find : S.transaction -> address -> (node option, Concepts.Condition.condition) result
val empty : node
+ val empty_under : S.transaction -> (address, Concepts.Condition.condition) result
val hash_of : node -> address
@@ -68,12 +69,12 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
| Trunk { keys; _ } -> keys
let of_bencode =
- let open Concepts.Codec.Bencode in
+ let open Concepts.Encoding.Bencode in
let open Utilities.Result in
(* This is terrible *)
let decode_key t = as_string t
|> Result.map String.to_bytes
- |> Result.map Concepts.Representation.blob_of_bytes
+ |> Result.map Concepts.Blob.blob_of_bytes
|> fmap K.decode in
let decode_value t = as_string t |> Result.map Concepts.Hash.of_raw_string in
let decode_list f data = data
@@ -92,14 +93,14 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
Ok (Trunk { keys; children })
| _ -> Error (Error.malformed_node ())
- let from_blob blob = Concepts.Codec.Bencode.of_blob blob
+ let from_blob blob = Concepts.Encoding.Bencode.of_blob blob
|> Utilities.Result.fmap of_bencode
let to_bencode =
- let open Concepts.Codec.Bencode in
+ let open Concepts.Encoding.Bencode in
(* Ditto. *)
let bencode_key k = K.encode k
- |> Concepts.Representation.bytes_of_blob
+ |> Concepts.Blob.bytes_of_blob
|> String.of_bytes
|> (fun s -> String s) in
let bencode_hash h = String (Concepts.Hash.to_raw_string h) in
@@ -111,7 +112,7 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
Tagged ('#', Dict [("keys", List (BatFingerTree.to_list keys |> List.map bencode_key));
("children", List (BatFingerTree.to_list children |> List.map bencode_hash))])
- let to_blob node = to_bencode node |> Concepts.Codec.Bencode.to_blob
+ let to_blob node = to_bencode node |> Concepts.Encoding.Bencode.to_blob
(* TODO: we should probably cache this inside the node itself rather
than recalculating it every time. We could also allow the user to
@@ -121,7 +122,7 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
let find tx addr =
let open Utilities.Result in
- let* data = S.get tx addr in
+ let* data = S.get tx (S.Hash node) in
match data with
| None -> Ok None
| Some data ->
@@ -149,9 +150,11 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
let open Utilities.Result in
let data = to_blob node in
let addr = Concepts.Hash.hash_of_blob data in
- let* () = S.put tx addr data in
+ let* () = S.put tx (S.Hash addr) data in
Ok addr
+ let empty_under tx = persist tx empty
+
type op = Update of address * node | Split of address * K.t * address
let emplace i v ft =
@@ -217,7 +220,7 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
BatFingerTree.iter
(fun k ->
K.encode k
- |> Concepts.Representation.bytes_of_blob
+ |> Concepts.Blob.bytes_of_blob
|> Buffer.add_bytes buffer)
ks;
Concepts.Hash.hash_of_bytes (Buffer.to_bytes buffer)
@@ -303,7 +306,7 @@ module Make : TREE = functor (S : Abstract.Storage.STORAGE) (K : KEY) -> struct
end
module type INTERFACE = functor (S : Abstract.Storage.STORAGE) (K : KEY) (V : VALUE) -> sig
- type address
+ type address = Concepts.Hash.hash
type node
val find : S.transaction -> address -> (node option, Concepts.Condition.condition) result
@@ -332,11 +335,11 @@ module Interface : INTERFACE = functor (S : Abstract.Storage.STORAGE) (K : KEY)
let intern tx v =
let data = V.encode v in
let addr = Concepts.Hash.hash_of_blob data in
- let* () = S.put tx addr data in
+ let* () = S.put tx (S.Hash addr) data in
Ok addr
let retrieve tx addr =
- let* data = S.get tx addr in
+ let* data = S.get tx (S.Hash addr) in
match data with
| None -> Ok None
| Some data ->
@@ -379,3 +382,11 @@ module Interface : INTERFACE = functor (S : Abstract.Storage.STORAGE) (K : KEY)
(fun _ k v -> f k v |> ignore)
() node
end
+
+module StringKey : KEY with type t = string = struct
+ type t = string
+
+ let encode s = String.to_bytes s |> Concepts.Blob.blob_of_bytes
+ let compare s1 s2 = String.compare s1 s2 |> Concepts.Ordering.of_int
+ let decode b = Concepts.Blob.bytes_of_blob b |> String.of_bytes |> Result.ok
+end