aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/data/merklesearchtree.ex28
1 files changed, 27 insertions, 1 deletions
diff --git a/lib/data/merklesearchtree.ex b/lib/data/merklesearchtree.ex
index d23e8a7..29c1dab 100644
--- a/lib/data/merklesearchtree.ex
+++ b/lib/data/merklesearchtree.ex
@@ -114,7 +114,7 @@ defmodule SData.MerkleSearchTree do
defp aux_insert_after_first(store, lst, key, value) do
case lst do
- [ {k1, _, r1} | rst ] when k1 == key ->
+ [ {k1, _old_value, r1} | rst ] when k1 == key ->
{ [ {k1, value, r1} | rst ], store }
[ {k1, v1, r1} ] ->
{r1a, r1b, new_store} = split(store, r1, key)
@@ -144,6 +144,32 @@ defmodule SData.MerkleSearchTree do
end
end
+ def get(state, key) do
+ get(state.store, state.root, key)
+ end
+
+ defp get(store, root, key) do
+ case root do
+ nil -> nil
+ _ ->
+ { _, low, lst } = store[root]
+ get_aux(store, low, lst, key)
+ end
+ end
+
+ defp get_aux(store, low, lst, key) do
+ case lst do
+ [] ->
+ get(store, low, key)
+ [ {k, v, _} | _ ] when key == k ->
+ v
+ [ {k, _, _} | _ ] when key < k ->
+ get(store, low, key)
+ [ {k, _, low2} | rst ] when key > k ->
+ get_aux(store, low2, rst, key)
+ end
+ end
+
def dump(state) do
dump(state.store, state.root, "")
end