From cced5d1a69b8118fb07cd6ab1b4b315cd9438321 Mon Sep 17 00:00:00 2001 From: metanivek Date: Tue, 16 Aug 2022 10:42:25 -0400 Subject: [PATCH] apply tezos order optimization https://github.com/mirage/irmin/pull/2014 --- src/lib_context/encoding/context.ml | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/lib_context/encoding/context.ml b/src/lib_context/encoding/context.ml index 9463ecf4287..0d2ef92baa4 100644 --- a/src/lib_context/encoding/context.ml +++ b/src/lib_context/encoding/context.ml @@ -122,8 +122,6 @@ struct type entry = string * M.value - let step_t = Irmin.Type.string - let metadata_t = let some = "\255\000\000\000\000\000\000\000" in let none = "\000\000\000\000\000\000\000\000" in @@ -144,25 +142,24 @@ struct let open Irmin.Type in record "Tree.entry" (fun _ _ _ -> assert false) |+ field "kind" metadata_t metadata_of_entry - |+ field "name" step_t fst + |+ field "name" string fst |+ field "hash" Hash.t hash_of_entry |> sealr let entries_t : entry list Irmin.Type.t = Irmin.Type.(list ~len:`Int64 entry_t) + let pre_hash_entry = Irmin.Type.(unstage (pre_hash entry_t)) let pre_hash_entries = Irmin.Type.(unstage (pre_hash entries_t)) - - let compare_entry (x, _) (y, _) = String.compare x y - - let step_to_string = Irmin.Type.(unstage (to_bin_string Path.step_t)) - - let str_key (k, v) = (step_to_string k, v) - - let pre_hash t = - M.list t |> List.map str_key - |> List.fast_sort compare_entry - |> pre_hash_entries + let encode_bin_int64 = Irmin.Type.(unstage (pre_hash int64)) + + let pre_hash t f = + match M.length t with + | 0 -> pre_hash_entries [] f + | 1 -> + encode_bin_int64 1L f; + pre_hash_entry (List.hd (M.list t)) f + | _ -> pre_hash_entries (M.list t) f end include M